ToB企服应用市场:ToB评测及商务社交产业平台

标题: StoneDB主从切换实践方案 [打印本页]

作者: 傲渊山岳    时间: 2022-10-11 12:39
标题: StoneDB主从切换实践方案
StoneDB 的主从切换既可以手动切换,也可以自动切换,自动切换通常需要使用第三方中间件。本文介绍的是较为常用的中间件 Replication Manager,当 master 发生宕机时,可自动切换至 slave,保证业务正常运行,故障节点恢复后再加入主从。
服务器配置说明
IPMemoryCPUOS version192.168.30.408G8CCentOS Linux release 7.9192.168.30.418G8CCentOS Linux release 7.9192.168.30.428G8CCentOS Linux release 7.9192.168.30.4616G16CCentOS Linux release 7.9注:主从环境中的各个服务器的配置一般情况下建议是一致的,但由于 StoneDB 不管重放 binlog,还是用于 OLAP 场景的查询,都是较消耗系统资源的,建议 StoneDB 配置略高于 MySQL。
主从环境说明
IPDATABASEROLEDB version192.168.30.40MySQLmasterMySQL 5.7192.168.30.41/Replication Manager/192.168.30.42MySQLslaveMySQL 5.7192.168.30.46StoneDBslaveStoneDB 5.7注:MySQL 与 StoneDB 的版本建议保持一致。
推荐采用一主两从的架构,其中 StoneDB 不参与主从切换:
1)master(192.168.30.40)使用 InnoDB 引擎,可读写,提供 OLTP 场景的读写业务;
2)slave1(192.168.30.42)使用 InnoDB 引擎,只读,同时作为 standby,当 master 发生宕机时,可切换至 slave1,保证业务正常运行;
3)slave2(192.168.30.46)使用 Tianmu 引擎,只读,提供 OLAP 场景的读业务。
1、操作系统环境检查

操作系统环境检查的步骤在四个节点均需要执行。
1.1 关闭防火墙
  1. # systemctl stop firewalld
  2. # systemctl disable firewalld
复制代码
1.2 关闭SELINUX
  1. # vim /etc/selinux/config
  2. SELINUX = disabled
复制代码
1.3 设置Swap分区

修改vm.swappiness的值为1,表示尽量不使用Swap。
  1. # vi /etc/sysctl.conf
  2. vm.swappiness = 1
复制代码
1.4 修改操作系统的限制
  1. # ulimit -a
  2. core file size          (blocks, -c) 0
  3. data seg size           (kbytes, -d) unlimited
  4. scheduling priority             (-e) 0
  5. file size               (blocks, -f) unlimited
  6. pending signals                 (-i) 1031433
  7. max locked memory       (kbytes, -l) 64
  8. max memory size         (kbytes, -m) unlimited
  9. open files                      (-n) 65535
  10. pipe size            (512 bytes, -p) 8
  11. POSIX message queues     (bytes, -q) 819200
  12. real-time priority              (-r) 0
  13. stack size              (kbytes, -s) 10240
  14. cpu time               (seconds, -t) unlimited
  15. max user processes              (-u) 1024
  16. virtual memory          (kbytes, -v) unlimited
  17. file locks                      (-x) unlimited
  18. 修改操作系统的软硬限制
  19. # vim /etc/security/limits.conf
  20. * soft nofile 65535
  21. * hard nofile 65535
  22. mysql soft nproc 1028056
  23. mysql hard nproc 1028056
复制代码
1.5 创建用户
  1. # groupadd mysql
  2. # useradd -g mysql mysql
  3. # passwd mysql
复制代码
Replication Manager 节点无需创建,以上步骤执行完之后,重启操作系统。
2、部署MySQL

在 master 节点和 slave1 节点安装 MySQL。
2.1 下载安装包

https://downloads.mysql.com/archives/community/
从官网下载 MySQL 5.7 的安装包。
2.2 卸载mariadb
  1. # rpm -qa|grep mariadb
  2. mariadb-5.5.56-2.el7.x86_64
  3. mariadb-server-5.5.56-2.el7.x86_64
  4. mariadb-libs-5.5.56-2.el7.x86_64
  5. # yum remove mariadb*
  6. # rpm -qa|grep mariadb
复制代码
2.3 上传tar包并解压
  1. # tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
  2. # cd /usr/local/
  3. # mv mysql-5.7.36-linux-glibc2.12-x86_64 mysql
复制代码
2.4 创建目录
  1. # mkdir -p /mysql/data/
  2. # mkdir -p /mysql/log
  3. # chown -R mysql:mysql /mysql/
复制代码
2.5 配置参数文件 my.cnf

master
  1. # vim /etc/my.cnf
  2. [client]
  3. port    = 3306
  4. socket  = /mysql/data/mysql.sock
  5. [mysqld]
  6. port      = 3306
  7. basedir   = /usr/local/mysql
  8. datadir   = /mysql/data
  9. socket    = /mysql/data/mysql.sock
  10. pid_file  = /mysql/data/mysqld.pid
  11. log_error = /mysql/log/mysqld.log
  12. log_bin   = /mysql/log/mybinlog
  13. server_id = 40
  14. character_set_server = utf8mb4
  15. collation_server = utf8mb4_general_ci
  16. max_connections = 1000
  17. binlog_format = row
  18. default_storage_engine = innodb
  19. read_only=0
  20. innodb_buffer_pool_size = 4096000000
  21. innodb_log_file_size = 1024000000
  22. innodb_log_files_in_group = 3
  23. innodb_io_capacity = 4000
  24. innodb_io_capacity_max = 8000
  25. #开启GTID模式
  26. gtid_mode = on
  27. enforce_gtid_consistency = 1
  28. #并行复制
  29. binlog_transaction_dependency_tracking = WRITESET
  30. transaction_write_set_extraction = XXHASH64
复制代码
slave1
  1. # vim /etc/my.cnf
  2. [client]
  3. port    = 3306
  4. socket  = /mysql/data/mysql.sock
  5. [mysqld]
  6. port      = 3306
  7. basedir   = /usr/local/mysql
  8. datadir   = /mysql/data
  9. socket    = /mysql/data/mysql.sock
  10. pid_file  = /mysql/data/mysqld.pid
  11. log_error = /mysql/log/mysqld.log
  12. log_bin   = /mysql/log/mybinlog
  13. server_id = 42
  14. character_set_server = utf8mb4
  15. collation_server = utf8mb4_general_ci
  16. max_connections = 1000
  17. binlog_format = row
  18. default_storage_engine = innodb
  19. read_only=1
  20. innodb_buffer_pool_size = 4096000000
  21. innodb_log_file_size = 1024000000
  22. innodb_log_files_in_group = 3
  23. innodb_io_capacity = 4000
  24. innodb_io_capacity_max = 8000
  25. #开启GTID模式
  26. gtid_mode = on
  27. enforce_gtid_consistency = 1
  28. #并行复制
  29. slave_parallel_type = LOGICAL_CLOCK
  30. slave_parallel_workers = 4
复制代码
2.6 初始化实例
  1. /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql
复制代码
2.7 启动实例
  1. /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
复制代码
注:管理员用户的临时密码在 mysqld.log 中,第一次登陆后需要修改管理员用户的密码。
3、部署StoneDB

3.1 下载安装包

https://stonedb.io/zh/docs/download/
从官网下载 StoneDB 5.7 的安装包。
3.2 上传tar包并解压
  1. # cd /
  2. # tar -zxvf stonedb-ce-5.7-v1.0.0.el7.x86_64.tar.gz
复制代码
用户可根据安装规范将安装包上传至服务器,解压出来的目录是 stonedb57,示例中的安装路径是 /stonedb57。
3.3 检查依赖文件
  1. # cd /stonedb57/install/bin
  2. # ldd mysqld
  3. # ldd mysql
复制代码
如果检查返回有关键字"not found",说明缺少文件,需要安装对应的依赖包。例如:
libsnappy.so.1 => not found
在 Ubuntu 上使用命令 "sudo apt search libsnappy" 检查,说明需要安装 libsnappy-dev。在 RedHat 或者 CentOS 上使用命令 "yum search all snappy" 检查,说明需要安装 snappy-devel、snappy。
3.4 创建目录
  1. mkdir -p /stonedb57/install/data
  2. mkdir -p /stonedb57/install/binlog
  3. mkdir -p /stonedb57/install/log
  4. mkdir -p /stonedb57/install/tmp
  5. mkdir -p /stonedb57/install/redolog
  6. mkdir -p /stonedb57/install/undolog
  7. chown -R mysql:mysql /stonedb57
复制代码
3.5 配置参数文件 my.cnf
  1. # vim /stonedb57/install/my.cnf
  2. [client]
  3. port    = 3306
  4. socket  = /stonedb57/install/tmp/mysql.sock
  5. [mysqld]
  6. port      = 3306
  7. basedir   = /stonedb57/install/
  8. datadir   = /stonedb57/install/data
  9. socket    = /stonedb57/install/tmp/mysql.sock
  10. pid_file  = /stonedb57/install/data/mysqld.pid
  11. log_error = /stonedb57/install/log/mysqld.log
  12. log_bin   = /stonedb57/install/binlog/binlog
  13. server_id = 46
  14. character_set_server = utf8mb4
  15. collation_server = utf8mb4_general_ci
  16. max_connections = 1000
  17. binlog_format = row
  18. default_storage_engine = tianmu
  19. read_only=1
  20. innodb_buffer_pool_size = 2048000000
  21. innodb_log_file_size = 1024000000
  22. innodb_log_files_in_group = 3
  23. innodb_io_capacity = 4000
  24. innodb_io_capacity_max = 8000
  25. innodb_log_group_home_dir   = /stonedb57/install/redolog/
  26. innodb_undo_directory       = /stonedb57/install/undolog/
  27. innodb_undo_log_truncate    = 1
  28. innodb_undo_tablespaces     = 3
  29. innodb_undo_logs            = 128
  30. #开启GTID模式
  31. gtid_mode = on
  32. enforce_gtid_consistency = 1
  33. #并行复制
  34. slave_parallel_type = LOGICAL_CLOCK
  35. slave_parallel_workers = 8  
复制代码
3.6 初始化实例
  1. /stonedb57/install/bin/mysqld --defaults-file=/stonedb57/install/my.cnf --initialize --user=mysql
复制代码
3.7 启动实例
  1. /stonedb57/install/bin/mysqld_safe --defaults-file=/stonedb57/install/my.cnf --user=mysql &
复制代码
注:管理员用户的临时密码在 mysqld.log 中,第一次登陆后需要修改管理员用户的密码。
4、配置主从

4.1 创建复制用户
  1. create user 'repl'@'%' identified by 'mysql123';
  2. grant replication slave on *.* to 'repl'@'%';
复制代码
4.2 备份主库
  1. /usr/local/mysql/bin/mysqldump -uroot -pmysql123 --single-transaction --set-gtid-purged=on -B aa > /tmp/aa.sql
复制代码
4.3 传输备份文件
  1. scp /tmp/aa.sql root@192.168.30.42:/tmp
  2. scp /tmp/aa.sql root@192.168.30.43:/tmp
复制代码
注:如果数据较大,建议使用 mydumper.
4.4 slave1节点
  1. /usr/local/mysql/bin/mysql -uroot -pmysql123 -S /mysqldb/data/mysql.sock
  2. source /tmp/aa.sql
复制代码
注:恢复前需要确保 gtid_executed 为空。
4.5 slave2节点

在恢复前,需要修改存储引擎,注释锁表语句。
  1. sed -i 's/UNLOCK TABLES/-- UNLOCK TABLES/g' /tmp/aa.sql
  2. sed -i 's/LOCK TABLES `/-- LOCK TABLES `/g' /tmp/aa.sql
  3. sed -i 's/ENGINE=InnoDB/ENGINE=tianmu/g' /tmp/aa.sql
  4. /stonedb57/install/bin/mysql -uroot -pmysql123 -S /stonedb57/install/tmp/mysql.sock
  5. source /tmp/aa.sql
复制代码
注:恢复前需要确保 gtid_executed 为空。
4.6 建立主从复制

slave1节点
  1. CHANGE MASTER TO
  2. MASTER_HOST='192.168.30.40',
  3. MASTER_PORT=3306,
  4. MASTER_USER='repl',
  5. MASTER_PASSWORD='mysql123',
  6. MASTER_AUTO_POSITION = 1;
  7. start slave;
  8. show slave status\G
复制代码
slave2节点
  1. CHANGE MASTER TO
  2. MASTER_HOST='192.168.30.40',
  3. MASTER_PORT=3306,
  4. MASTER_USER='repl',
  5. MASTER_PASSWORD='mysql123',
  6. MASTER_AUTO_POSITION = 1;
  7. start slave;
  8. show slave status\G
复制代码
5、配置Replication Manager

5.1 配置hosts文件

在所有节点都要配置
  1. # vim /etc/hosts
  2. 192.168.30.40 HAMI01
  3. 192.168.30.41 HAMI02
  4. 192.168.30.42 HAMI03
  5. 192.168.30.46 HAST05
复制代码
5.2 配置免密

在 Replication Manager 节点配置
  1. ssh-keygen
  2. ssh-copy-id HAMI01
  3. ssh-copy-id HAMI03
  4. ssh-copy-id HAST05
  5. ssh HAMI01
  6. ssh HAMI03
  7. ssh HAST05
复制代码
注:若 ssh 免密登录表示免密配置成功。
5.3 配置yum源
  1. # vim /etc/yum.repos.d/signal18.repo
  2. [signal18]
  3. name=Signal18 repositories
  4. baseurl=http://repo.signal18.io/centos/2.1/$releasever/$basearch/
  5. gpgcheck=0
  6. enabled=1
复制代码
5.4 安装Replication Manager
  1. # yum install -y replication-manager-osc
  2. # rpm -qa|grep replication
  3. replication-manager-osc-2.2.20-1.x86_64
复制代码
5.5 主库创建监控用户
  1. create user 'rep_monitor'@'%' identified by 'mysql123';
  2. grant reload, process, super, replication slave, replication client, event ON *.* to 'rep_monitor'@'%';
  3. grant select ON mysql.event to 'rep_monitor'@'%';
  4. grant select ON mysql.user to 'rep_monitor'@'%';
  5. grant select ON performance_schema.* to 'rep_monitor'@'%';
复制代码
5.6 配置config.toml
  1. # vim /etc/replication-manager/config.toml
  2. # 集群名称
  3. [StoneDB-HA]
  4. # 主从节点
  5. db-servers-hosts = "192.168.30.40:3306,192.168.30.42:3306,192.168.30.46:3306"
  6. # 主节点
  7. db-servers-prefered-master = "192.168.30.40:3306"
  8. # 监控用户
  9. db-servers-credential = "rep_monitor:mysql123"
  10. db-servers-connect-timeout = 2
  11. # 复制用户
  12. replication-credential = "repl:mysql123"
  13. # StoneDB不被用于切换
  14. db-servers-ignored-hosts="192.168.30.46:3306"
  15. ##############
  16. ## FAILOVER ##
  17. ##############
  18. # 故障自动切换
  19. failover-mode = "automatic"
  20. # 30s内再次发生故障不切换,防止硬件问题或网络问题
  21. failover-time-limit=30
  22. [Default]
  23. #########
  24. ## LOG ##
  25. #########
  26. log-file = "/var/log/replication-manager.log"
  27. log-heartbeat = false
  28. log-syslog = false
  29. monitoring-datadir = "/var/lib/replication-manager"
  30. log-level=1
  31. replication-multi-master = false
  32. replication-multi-tier-slave = false
  33. failover-readonly-state = true
  34. http-server = true
  35. http-bind-address = "0.0.0.0"
  36. http-port = "10001"
复制代码
5.7 启动Replication Manager
  1. # systemctl start replication-manager
  2. # netstat -lntp|grep replication
  3. tcp6       0      0 :::10001                :::*                    LISTEN      13128/replication-m
  4. tcp6       0      0 :::10005                :::*                    LISTEN      13128/replication-m
复制代码
5.8 WEB登录

http://192.168.30.41:10001
默认用户名密码为 admin/repman

6、建议项

1)建议设置为 GTID 模式;
2)建议主从配置成半同步模式;
3)StoneDB 不参与主从切换。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4