云服务器内容精选

  • 参数说明 表1 参数说明 参数 是否必选 默认值 数据类型 说明 connector 是 无 String connector类型,需配置为'redis'。 host 是 无 String redis连接地址。 port 否 6379 Integer redis连接端口。 password 否 无 String redis认证密码。 namespace 否 无 String redis key的namespace delimiter 否 : String redis的key和namespace之间的分隔符。 data-type 否 hash String redis的数据类型,有下列选项: hash list set sorted-set string data-type取值约束详见data-type取值约束说明。 schema-syntax 否 fields String redis的schema语义,包含以下值(其具体使用请参考注意事项和常见问题): fields:适用于所有数据类型 fields-scores:适用于sorted set数据类型 array:适用于list、set、sorted set数据类型 array-scores:适用于sorted set数据类型 map:适用于hash、sorted set数据类型 schema-syntax取值约束详见schema-syntax取值约束说明。 deploy-mode 否 standalone String Redis集群的部署模式,支持standalone、master-replica、cluster。默认为standalone。 Redis实例类型不同配置的部署模式不同: 单机、主备、proxy集群实例都选择standalone, cluster实例选择cluster。 retry-count 否 5 Integer 连接redis集群的尝试次数。 connection-timeout-millis 否 10000 Integer 尝试连接redis集群时的最大超时时间。 commands-timeout-millis 否 2000 Integer 等待操作完成响应的最大时间。 rebalancing-timeout-millis 否 15000 Integer redis集群失败时的休眠时间。 scan-keys-count 否 1000 Integer 每次扫描时读取的数量。 default-score 否 0 Double 当data-type设置为“sorted-set”时的默认score。 deserialize-error-policy 否 fail-job Enum 数据解析失败时的处理方式。枚举类型,包含以下值: fail-job:作业失败 skip-row:跳过当前数据 null-field:设置当前数据为null skip-null-values 否 true Boolean 是否跳过null。 ignore-retractions 否 false Boolean 连接器应忽略更新插入/撤回流模式下的收回消息。 key-column 否 无 String Redis 表schema的key source.parallelism 否 无 int 定义源的自定义并行度。默认情况下,如果未定义此选项,使用全局配置来的并行度。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 create table dwsSource ( attr_name attr_type (',' attr_name attr_type)* (',' watermark for rowtime_column_name as watermark-strategy_expression) ,PRIMARY KEY (attr_name, ...) NOT ENFORCED ) with ( 'connector' = 'redis', 'host' = '' );
  • 完整示例代码 通过DataFrame API 访问 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # _*_ coding: utf-8 _*_ from __future__ import print_function from pyspark.sql.types import StructType, StructField, IntegerType, StringType from pyspark.sql import SparkSession if __name__ == "__main__": # Create a SparkSession session. sparkSession = SparkSession.builder.appName("datasource-redis").getOrCreate() # Set cross-source connection parameters. host = "192.168.4.199" port = "6379" table = "person" auth = "######" # Create a DataFrame and initialize the DataFrame data. # ******* method noe ********* dataList = sparkSession.sparkContext.parallelize([(1, "Katie", 19),(2,"Tom",20)]) schema = StructType([StructField("id", IntegerType(), False),StructField("name", StringType(), False),StructField("age", IntegerType(), False)]) dataFrame_one = sparkSession.createDataFrame(dataList, schema) # ****** method two ****** # jdbcDF = sparkSession.createDataFrame([(3,"Jack", 23)]) # dataFrame = jdbcDF.withColumnRenamed("_1", "id").withColumnRenamed("_2", "name").withColumnRenamed("_3", "age") # Write data to the redis table dataFrame.write.format("redis").option("host", host).option("port", port).option("table", table).option("password", auth).mode("Overwrite").save() # Read data sparkSession.read.format("redis").option("host", host).option("port", port).option("table", table).option("password", auth).load().show() # close session sparkSession.stop() 通过SQL API 访问 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # _*_ coding: utf-8 _*_ from __future__ import print_function from pyspark.sql import SparkSession if __name__ == "__main__": # Create a SparkSession sparkSession = SparkSession.builder.appName("datasource_redis").getOrCreate() sparkSession.sql( "CREATE TEMPORARY VIEW person (name STRING, age INT) USING org.apache.spark.sql.redis OPTIONS (\ 'host' = '192.168.4.199', \ 'port' = '6379',\ 'password' = '######',\ 'table'= 'person')".stripMargin); sparkSession.sql("INSERT INTO TABLE person VALUES ('John', 30),('Peter', 45)".stripMargin) sparkSession.sql("SELECT * FROM person".stripMargin).collect().foreach(println) # close session sparkSession.stop()
  • 配置项说明 表1 配置参数详解 参数名称 是否必选 参数类型 取值范围 描述 props 否 PropertiesConfiguration 请参考PropertiesConfiguration数据结构说明。 MAS监控配置,配合etcd使用。 etcd 否 EtcdConfiguration 请参考EtcdConfiguration数据结构说明。 etcd配置,如配置,则会从远端拉取。 Redis 是 RedisConfiguration 请参考RedisConfiguration数据结构说明。 RedisServer配置。 routeAlgorithm 是 string single-read-write local-read-single-write double-write 路由算法。 active 是 string 只能是“dc1”或“dc2”。 激活的Redis。 chaos 否 InjectionProperties 请参考InjectionProperties数据结构说明 故障注入相关配置。 表2 RedisConfiguration数据结构说明 参数名称 是否必选 参数类型 取值范围 描述 nearest 否 string 只能是“dc1”或“dc2”。 指明哪个是近端Redis。 asyncRemoteWrite.retryTimes 否 int 默认为3。 异步写远端操作重试次数。 connectionPool.enable 否 bool true/false默认true。 是否启用连接池。 asyncRemotePool 否 AsyncRemotePoolConfiguration 请参考AsyncRemotePoolConfiguration数据结构说明。 异步写线程池配置。 servers 是 map[string]ServerConfiguration key为dc1/dc2 单个维度请参考ServerConfiguration数据结构说明。 dc1,dc2的RedisServer连接配置。 表3 AsyncRemotePoolConfiguration数据结构说明 参数名称 是否必选 参数类型 取值范围 描述 threadCoreSize 否 int - 线程池的基本大小。 persist 否 bool true/false 默认false。 命令是否持久化,否:速度快;是:速度比非持久化低。 taskQueueSize 否 int 默认5。 缓冲队列数。 persistDir 否 string 默认根目录"/"。 Redis日志文件目录。 表4 ServerConfiguration数据结构说明 参数名称 是否必选 参数类型 取值范围 描述 hosts 是 string - RedisServer地址。 password 是 string - RedisServer密码。 type 是 string cluster, master-slave, normal。 RedisServer类型。 cloud 是 string - RedisServer所属云。 region 是 string - RedisServer所属Region。 azs 是 string - RedisServer所属AZ。 pool 否 ServerConnectionPoolConfiguration 请参考ServcerConnectionPoolConfiguration数据结构说明。 连接池配置。 表5 ServcerConnectionPoolConfiguration数据结构说明 参数名称 是否必选 参数类型 取值范围 描述 maxTotal 否 int - 最大活动对象数。 maxIdle 否 int - 最大能够保持idle状态的对象数。 minIdle 否 int - 最小能够保持idle状态的对象数。 maxWaitMillis 否 int - 当池内没有返回对象时,最大等待时间。 timeBetweenEvictionRunsMillis 否 int - 空闲链接检测线程,检测的周期,毫秒数。如果为负值,表示不运行检测线程。默认为-1。 表6 PropertiesConfiguration数据结构说明 参数名称 是否必选 参数类型 取值范围 描述 version 是 string - 项目版本号。 appId 是 string - 项目组名称。 monitorId 是 string - 监控组名称。 cloud 否 string - 项目部署云组。 region 否 string - 项目部署region。 azs 否 string - 项目部署AZ。 表7 EtcdConfiguration数据结构说明 参数名称 是否必选 参数类型 取值范围 描述 address 是 string - Etcd地址。 apiVersion 是 string v3 Etcd版本。 username 是 string - Etcd用户名。 password 是 string - Etcd密码。 httpsEnable 是 bool true/false 是否启用https。 父主题: Redis
  • 前提条件 如果您还没有目标Redis,请先创建目标Redis,具体操作请参考购买Redis实例。 如果您已有目标Redis,则不需要重复创建,为了对比迁移前后数据及预留足够的内存空间,建议在数据迁移之前清空目标实例数据,清空操作请参考清空Redis实例数据。如果没有清空实例数据,数据迁移后,目标Redis与源Redis实例重复的数据迁移后会被覆盖,源Redis没有、目标Redis有的数据会保留。 已创建弹性 云服务器ECS ,创建弹性云服务器的方法,请参见创建弹性云服务器。 E CS 请选择与DCS Cluster集群实例相同虚拟私有云、子网和安全组,并且需要绑定弹性公网IP。
  • 迁移原理 Rump使用SCAN来获取keys,用DUMP/RESTORE来get/set值。 SCAN是一个时间复杂度O(1) 的命令,可以快速获得所有的key。DUMP/RESTORE使读/写值独立于关键工作。 以下是Rump的主要特性: 通过SCAN非阻塞式的获取key,避免KEYS命令造成Redis服务阻塞。 支持所有数据类型的迁移。 把SCAN和DUMP/RESTORE操作放在同一个管道中,利用pipeline提升数据迁移过程中的网络效率。 不使用任何临时文件,不占用磁盘空间。 使用带缓冲区的channels,提升源服务器的性能。
  • 迁移数据 执行如下命令迁移数据: rump -from {source_redis_address} -to {target_redis_address} {source_redis_address} 源Redis实例地址,格式为:redis://[user:password@]host:port/db,中括号部分为可选项,实例设置了密码访问时需要填写密码,格式遵循RFC 3986规范。注意用户名可为空,但冒号不能省略,例如redis://:mypassword@192.168.0.45:6379/1。 db为数据库编号,不传则默认为0。 {target_redis_address} 目标Redis实例地址,格式与from相同。 以下示例表示将本地Redis数据库的第0个DB的数据迁移到192.168.0.153这台Redis数据库中,其中密码以*替代显示。 [root@ecs ~]# ./rump -from redis://127.0.0.1:6379/0 -to redis://:******@192.168.0.153:6379/0 .Sync done. [root@ecs ~]#
  • 安装Rump 登录弹性云服务器。 下载Rump的release版本。 以64位Linux操作系统为例,执行以下命令: wget https://github.com/stickermule/rump/releases/download/0.0.3/rump-0.0.3-linux-amd64; 解压缩后,添加可执行权限。 mv rump-0.0.3-linux-amd64 rump; chmod +x rump;
  • 前提条件 如果您还没有目标Redis,请先创建目标Redis,具体操作请参考购买Redis实例。 如果您已有目标Redis,则不需要重复创建,为了对比迁移前后数据及预留足够的内存空间,建议在数据迁移之前清空目标实例数据,清空操作请参考清空Redis实例数据。如果没有清空实例数据,数据迁移后,目标Redis与源Redis实例重复的数据迁移后会被覆盖,源Redis没有、目标Redis有的数据会保留。 已创建弹性云服务器ECS,创建弹性云服务器的方法,请参见创建弹性云服务器。 ECS请选择与DCS Cluster集群实例相同虚拟私有云、子网和安全组,并且需要绑定弹性公网IP。 自建的源Redis Cluster集群如果是在本地或者其他云厂商的服务器上自建,需要允许被公网访问。
  • 在线迁移数据 使用如下命令同步源Redis集群和目标Redis集群数据: ./redis-shake -type sync -conf redis-shake.conf 执行日志中出现如下信息,代表全量数据同步完成,进入增量同步阶段: sync rdb done. 执行日志出现如下信息时,代表增量同步无新增内容,可手动停止同步(Ctrl + C): sync: +forwardCommands=0 +filterCommands=0 +writeBytes=0 图1 RedisShake在线迁移示意图
  • 配置RedisShake工具 登录弹性云服务器ECS。 在ECS中执行以下命令下载RedisShake。本文以下载2.1.2版本为例,您可以根据实际需要下载其他RedisShake版本。 wget https://github.com/tair-opensource/RedisShake/releases/download/release-v2.1.2-20220329/release-v2.1.2-20220329.tar.gz 执行命令解压RedisShake文件。 tar -xvf redis-shake-v2.1.2.tar.gz 执行命令进入解压后的RedisShake文件目录。 cd redis-shake-v2.0.3 编辑RedisShake工具配置文件redis-shake.conf,补充源端与目标端所有master节点信息。 vim redis-shake.conf 修改内容如下: source.type = cluster #如果无密码,本项不填 source.password_raw = {source_redis_password} #源Cluster集群所有master节点的IP地址与端口,以分号分隔 source.address = {master1_ip}:{master1_port};{master2_ip}:{master2_port}…{masterN_ip}:{masterN_port} target.type = cluster #如果无密码,本项不填 target.password_raw = {target_redis_password} #目标Cluster集群所有master节点的IP地址与端口,以分号分隔 target.address = {master1_ip}:{master1_port};{master2_ip}:{master2_port}…{masterN_ip}:{masterN_port} 修改后按下Esc键退出编辑模式,输入:wq!按回车键保存配置并退出编辑界面。
  • 获取源Redis和目标Redis节点信息 分别连接源端和目标端Redis。连接Redis的方法请参考Redis-cli客户端连接Redis。 在线迁移Cluster集群时需要将Cluster集群各个节点数据分别迁移。执行如下命令分别查询源端和目标Cluster集群的所有节点的IP地址与端口: redis-cli -h {redis_address} -p {redis_port} -a {redis_password} cluster nodes {redis_address}为Redis的连接地址,{redis_port}为Redis的端口,{redis_password}为Redis的连接密码。 在命令返回的结果中,获取所有master节点的IP端口,如下如所示:
  • 新建独享型负载均衡器并进行配置 购买独享型负载均衡器,详情参考创建独享型负载均衡器。需要注意以下事项: 选择“规格”时,需要选择网络型(TCP/UDP)。 在网络配置中,必须开启‘跨VPC后端’, 以支持负载均衡器添加后端IP。 需要使用新创建或者已有的“弹性公网IP”,以支持公网访问。 添加监听器,详情参考添加TCP监听器。需要注意以下事项: 图1 添加监控器 在“配置监听器”时,前端协议选择TCP,前端端口建议设置为Redis常用端口6379。 在配置“添加后端服务器”时,选择“跨VPC后端”,单击“添加跨VPC后端”。在跨VPC后端IP,配置GeminiDB Redis实例的负载均衡地址、端口信息。 “配置健康检查”保持开启即可。 创建对等连接 ,选择“本端VPC”和“对端VPC”。 “本端VPC”选择ELB所在的VPC。 若选择的“所属VPC”和GeminiDB Redis在同一个虚拟私有云(VPC)中,“对端VPC”选择任一个非ELB所在的VPC。 若选择的“所属VPC”和GeminiDB Redis不在同一个虚拟私有云(VPC)中,“对端VPC”选择GeminiDB Redis实例所在的VPC。 详情参考创建相同账户下的对等连接。 单击创建好的对等连接名称,进入对等连接基本信息页面。 图2 对等连接 单击“路由表”,进入路由表基本信息页面。 图3 路由表 配置对等连接的本端路由、对端路由。 添加本端路由:单击“添加路由”,弹出“添加路由”窗口,“目的地址”输入对等连接中“对端VPC网段”值,“下一跳类型”选择“对等连接”,“下一跳”选择4中创建的对等连接,单击“确定”。 添加对端路由:单击“添加路由”,弹出“添加路由”窗口,“目的地址”输入对等连接中“本端VPC网段”值,“下一跳类型”选择“对等连接”,“下一跳”选择4中创建的对等连接,单击“确定”。 对添加的GeminiDB Redis的负载均衡地址进行健康检查,单击“监听器”,当健康检查结果为“正常”时,表示正常使用。
  • 使用须知 目标实例必须与弹性云服务器在同一个虚拟私有云和子网内才能访问。 弹性云服务器必须处于目标实例所属安全组允许访问的范围内。 场景一:如果目标实例所属安全组为默认安全组, 则无需设置安全组规则。 场景二:如果目标实例所属安全组非默认安全组,请查看安全组规则是否允许该弹性云服务器访问。 如果安全组规则允许弹性云服务器访问,即可连接实例。 如果安全组规则不允许弹性云服务器访问,需要在实例安全组添加一条“入”的访问规则。 设置安全组的具体操作请参考配置节点安全组规则。
  • 迁移步骤 分别在华为云ECS和源端转发服务器上安装Nginx,本文以ECS操作系统为Centos7.x为例进行安装,不同操作系统命令稍有不同。 执行以下命令,添加Nginx到yum源。 sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 添加完之后,执行以下命令,查看是否已经添加成功。 yum search nginx 添加成功之后,执行以下命令,安装Nginx。 sudo yum install -y nginx 执行以下命令安装stream模块。 yum install nginx-mod-stream --skip-broken 启动Nginx并设置为开机自动运行。 sudo systemctl start nginx.service sudo systemctl enable nginx.service 在本地浏览器中输入服务器地址(ECS公网IP地址),查看安装是否成功。 如果出现下面页面,则表示安装成功。 在源端Redis添加源端转发服务器的白名单。 在源端转发服务器配置安全组。 获取华为云ECS的公网IP地址。 配置源端转发服务器安全组入方向,添加华为云ECS的公网IP地址,并放开来自华为云ECS访问请求的端口(以6379为例)。 配置源端转发服务器的Nginx转发配置。 登录Linux源端转发服务器,执行命令打开并修改配置文件。 cd /etc/nginx vi nginx.conf 转发配置示例如下: stream { server { listen 6379; proxy_pass {source_instance_address}:{port}; } } 其中,6379为源端转发服务器本机监听端口,{source_instance_address}和{port}为源端Redis实例的连接地址和端口。 配置目的:通过访问源端转发服务器本机监听端口6379,访问源端Redis。 注意:以上配置必须配置在如下图所示的位置。 图2 配置位置要求 重启Nginx服务。 service nginx restart 验证启动是否成功。 netstat -an|grep 6379 端口在监听状态,Nginx启动成功。 图3 验证结果 配置华为云ECS的Nginx转发配置。 登录Linux华为云ECS,执行命令打开并修改配置文件。 cd /etc/nginx vi nginx.conf 配置示例如下: stream { server { listen 6666; proxy_pass {source_ecs_address}:6379; } } 其中,6666为华为云ECS本机监听端口,{source_ecs_address}为源端转发服务器公网IP地址,6379为源端转发服务器Nginx的监听端口。 配置目的:通过访问华为云ECS本机监听端口6666,访问源端转发服务器。 注意:以上配置必须配置在如下图所示的位置。 图4 配置位置要求 重启Nginx服务。 service nginx restart 验证启动是否成功。 netstat -an|grep 6666 端口在监听状态,Nginx启动成功。 图5 验证结果 在华为云ECS执行以下命令测试6666端口的网络连接。 redis-cli -h {target_ecs_address} -p 6666 -a {password} 其中,{target_ecs_address}为华为云ECS公网IP地址,6666为华为云ECS监听端口,{password}为源端Redis密码,如无密码可不填。 图6 连接示例 准备迁移工具RedisShake。 登录华为云ECS。 在华为云ECS中执行以下命令下载RedisShake,本文以下载2.0.3版本为例进行说明。您可以根据实际需要下载其他RedisShake版本。 wget https://github.com/tair-opensource/RedisShake/releases/download/release-v2.0.3-20200724/redis-shake-v2.0.3.tar.gz 执行命令解压RedisShake文件。 tar -xvf redis-shake-v2.0.3.tar.gz 配置RedisShake的配置文件。 执行命令进入解压后的目录。 cd redis-shake-v2.0.3 修改配置文件redis-shake.conf。 vim redis-shake.conf 修改源端Redis信息配置: source.type 源端redis实例类型,单机、主备、proxy集群实例都选择standalone,cluster实例选择cluster。 source.address 华为云ECS公网IP地址和映射源端转发服务器的端口(华为云ECS监听端口6666),用英文冒号隔开。 source.password_raw 源端待迁移Redis实例的密码,如未设置密码,无需填写。 修改目标端DCS信息配置: target.type 华为云Redis实例类型,单机、主备、proxy集群实例都选择standalone,cluster实例选择cluster。 target.address 华为云Redis实例的连接地址和端口,用英文冒号隔开。 target.password_raw 华为云Redis实例的密码,如未设置密码,无需填写。 按下Esc键退出编辑模式,输入:wq!按回车键保存配置并退出编辑界面。 执行命令启动RedisShake并使用rump(在线全量)模式开始数据迁移。 ./redis-shake.linux -conf redis-shake.conf -type rump 图7 迁移过程 图8 迁移结果 迁移完成后,请使用redis-cli工具连接源Redis和目标Redis,确认数据的完整性。 分别连接源Redis和目标Redis。 连接操作请参考redis-cli连接。 输入info keyspace,查看keys参数和expires参数的值。 对比源Redis和目标Redis的keys参数分别减去expires参数的差值。如果差值一致,表示数据完整,迁移正常。 删除RedisShake配置文件。