{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-05-17 20:55:33","updateBy":"admin","updateTime":"2021-05-17 20:55:33","remark":null,"id":58,"articleTitle":"Docker（四）MySQL、Redis服务安装实战","articleUrl":"docker_container_instance","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220906/713782e83c4e4b9bbf2d588c2789e07d.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"使用Docker配置服务，如MySQL、redis等。单节点及集群方式与直接部署在服务器上有和不同？","articleContent":"## Docker安装MySQL主从集群\n\ndocker配置MySQL主从集群与直接在服务器上配置主从集群相似，主要是启动两个mysql容器实例。其余配置主从同步的语句与服务器中相同。\n\n1. 启动mysql主节点3307\n\n   ```shell\n   docker run -d -p 3307:3306 --privileged=true -v /mysql-master/log:/var/log/mysql -v /mysql-master/data:/var/lib/mysql -v /mysql-master/conf:/etc/my.cnf.d -e MYSQL_ROOT_SECRET=root  --name mysql-master  mysql:5.7\n   ```\n\n2. 创建主节点配置文件\n\n   ```shell\n   vim /mysql-master/conf/my.cnf\n   \n   [mysqld]\n   server-id=1 # 指定server-id，同一局域网中必须唯一\n   log-bin=mysql-binlog # 开启二进制日志\n   binlog_cache_size=1M # 设置二进制日志使用内存的大小（事务）\n   binlog-ignore-db=mysql # 指定不需要同步的数据库名称\n   expire_logs_days=5 # 设置二进制日志过期清理时间，默认值为0，表示不清理\n   slave_skip_errors=1062 # 跳过主从复制中遇到的所有错误或指定类型错误，避免主从复制中断。如1062指一些主键重复，1032指主从数据库数据不一致\n   ```\n\n3. 重启主节点容器\n\n   ```shell\n   docker restart mysql-master\n   ```\n\n4. 进入主节点创建主从同步账号\n\n   ```shell\n   docker exec -it mysql-master /bin/bash\n   mysql -uroot -proot\n   >>> CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';\n   >>> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';\n   >>> flush privileges;\n   >>> show master status;\n   +---------------+----------+--------------+------------------+-------------------+\n   | File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |\n   +---------------+----------+--------------+------------------+-------------------+\n   | binlog.000001 |     1443 |              |  mysql           |                   |\n   +---------------+----------+--------------+------------------+-------------------+\n   \n   ```\n\n5. 创建从节点3308\n\n   ```shell\n   docker run -d -p 3308:3306 --privileged=true -v /mysql-slave/log:/var/log/mysql -v /mysql-slave/data:/var/lib/mysql -v /mysql-slave/conf:/etc/my.cnf.d -e MYSQL_ROOT_SECRET=root  --name mysql-slave  mysql:5.7\n   ```\n\n6. 创建从节点配置文件\n\n   ```shell\n   vim /mysql-slave/conf/my.cnf\n   \n   [mysqld]\n   server-id=2 # 指定server-id，同一局域网中必须唯一\n   log-bin=mysql-binlog # 开启二进制日志\n   binlog_cache_size=1M # 设置二进制日志使用内存的大小（事务）\n   binlog-ignore-db=mysql # 指定不需要同步的数据库名称\n   expire_logs_days=5 # 设置二进制日志过期清理时间，默认值为0，表示不清理\n   slave_skip_errors=1062 # 跳过主从复制中遇到的所有错误或指定类型错误，避免主从复制中断。如1062指一些主键重复，1032指主从数据库数据不一致\n   relay_log=mysql-relay-bin # 配置中继日志\n   log_slave_updates=1 # 表示将复制事件写进自己的二进制日志\n   read_only=1 # slave设置为只读\n   ```\n\n7. 重启从节点\n\n   ```shell\n   docker restart mysql-slave\n   ```\n\n8. 进入从服务器设置主从同步\n\n   ```shell\n   docker exec -it mysql-slave /bin/bash\n   \n   mysql -uroot -proot\n   >>>\tCHANGE MASTER TO MASTER_HOST='192.168.52.233',MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_PORT='3307',MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1443;\n   >>> start slave;\n   ```\n\n\n## Docker安装单节点Redis\n\n1. 宿主机上创建目录/app/redis，并将redis.conf配置文件拷贝到该目录下，修改配置文件中特定的几个参数。\n\n   ```shell\n   mkdir -p /app/redis\n   redis.conf\n   #bind 127.0.0.1 # 允许redis外地连接\n   daemonize no # 禁止后台运行，否则与docker命令中-d参数冲突会导致容器启动报错\n   appendonly yes # 开启数据持久化\n   \n   ```\n\n2. 启动redis容器\n\n   ```shell\n   docker run -p 6379:6379 --name redis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf\n   ```\n\n   \n\n## Docker安装配置Redis集群\n\n1. 启动六个redis容器实例，端口分配为6381-6386。\n\n   ```shell\n   docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381\n   docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382\n   docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383\n   docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384\n   docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385\n   docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386\n   ```\n\n2. 将6个redis节点配置为集群形式\n\n   ```shell\n   以下命令需要进入容器中执行\n   redis-cli --cluster create 192.168.52.233:6381 192.168.52.233:6382 192.168.52.233:6383 192.168.52.233:6384 192.168.52.233:6385 192.168.52.233:6386 --cluster-replicas 1\n   # 槽位号分布\n   6381: [0-5460]\n   6382: [5461-10922]\n   6383: [10923-16383]\n   ```\n\n3. 集群读写路由增强正确命令\n\n   ```shell\n   docker exec -it redis-node-1 /bin/bash\n   redis-cli -p 6381 -c # 防止路由失效，不加此参数，当设置的key-value所需槽位不在本节点时会报错：(error) MOVED 12706 192.168.52.233:6383\n   \n   redis-cli --cluster check 192.168.52.233:6381 # 集群检查命令\n   ```\n\n### 集群扩容\n\n1. 新增两个redis节点，端口号设置为6387,6388。\n\n   ```shell\n   docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387\n   docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388\n   ```\n\n2. 进入6387实例内部，将新增的6387节点作为master节点加入集群\n\n   ```shell\n   redis-cli --cluster add-node 192.168.52.233:6387 192.168.52.233:6381\n   ```\n\n3. 重新分配槽位\n\n   ```shell\n   redis-cli --cluster reshard 192.168.52.233:6381\n   How many slots do you want to move (from 1 to 16384)? 4096 # 四个主节点，每个节点分配4096个槽位，将4096个槽位分配出去。\n   What is the receiving node ID? de6ve861cefvegg # 此nodeID为新建的6387节点的ID\n   Source node #1: all\n   Do you want to proceed with the proposed reshard plan (yes/no)? yes\n   # 分配后的槽位号为\n   6381: [1365-5460]\n   6382: [6827-10922]\n   6383: [12288-16383]\n   6387: [0-1364],[5461-1826],[10923-12287]\n   ```\n\n4. 为主节点6387分配从节点6388\n\n   ```shell\n   redis-cli --cluster add-node 192.168.522.233:6388 192.168.52.233:6387 --cluster-slave --cluster-master-id de6ve861cefvegg # 此编号为6387编号\n   ```\n\n### 集群缩容\n\n1. 先在集群中清除从节点6388\n\n   ```shell\n   redis-cli --cluster del-node 192.168.52.233:6388 def4813fewvbtes5548115\n   ```\n\n2. 将6387槽位号清空，重新分配\n\n   ```shell\n   redis-cli --cluster reshard 192.168.52.233:6381\n   How many slots do you want to move (from 1 to 16384)? 4096 # 四个主节点，每个节点分配4096个槽位，将4096个槽位分配出去。\n   What is the receiving node ID? fwrg5684vbyrh8188 # 此nodeID为6381节点的ID\n   Source node #1: de6ve861cefvegg # 6387的节点ID\n   Source node #2: done\n   Do you want to proceed with the proposed reshard plan (yes/no)? yes\n   ```\n\n3. 将6387节点从集群中删除\n\n   ```shell\n   redis-cli --cluster del-node 192.168.52.233:6387 de6ve861cefvegg\n   ```","categoryId":9,"viewCount":595,"categoryName":"Docker","author":"球接子","authorAvatar":null,"tagIds":[9],"tagNames":["Docker"]}}