记录我的一些生活写照、无聊的牢骚、内心世界的活动 注册 | 登陆

Mysql双主+keepalived实现故障自动切换+MYSQL备份实战

Mysql双主+keepalived实现故障自动切换+MYSQL备份实战
Mysql双主+keepalived实现故障自动切换
一. 项目基本情况
* 项目概述
项目要求: MySQL业务搭建双主模式服务+keepalived 实现故障自动切换
* 基础环境信息
XML/HTML代码
  1. 主机名 VIP IP  OS系统    CPU 内存  磁盘  系统角色    端口  安装软件
  2. mysql-01    10.28.3.194 10.28.3.195 CentOS Linux 7.9    4   16  200 master-01   3306    MySQL Server
  3. mysql-02    10.28.3.194 10.28.3.196 CentOS Linux 7.9    4   16  200 master-02   3306    MySQL Server
* 软件安装清单
XML/HTML代码
  1. 所需要安装软件 版本  下载地址  
  2. MySQL Server    8.0.33  downloads.mysql  
  3. keepalived  1.3.5   yum 安装  
* 架构情况
XML/HTML代码
  1.                     Keepalived
  2.                       VIP
  3.                    10.28.3.194
  4.   
  5.   Master1            主主同步          Master2
  6. 10.28.3.195  <------------------->  10.28.3.195
二. 基础环境配置
需要在两台服务器上都执行。
1. 修改主机名
#2台服务器分别执行:
XML/HTML代码
  1. cat << EOF >> /etc/hosts
  2. 10.28.3.195  mysql-01
  3. 10.28.3.196  mysql-02
  4. EOF
2. 关闭SELinux
XML/HTML代码
  1. setenforce 0
3. 将下载好的安装包放在服务器的/usr/local
XML/HTML代码
  1. cd /data/
  2. #  查看安装包情况
  3. ls -lsrth
  4. -- 解压到 /usr/local
  5. tar -vxf /data/mysql-8.0.33-linux-glibc2.17-x86_64-minimal.tar.xz -C /usr/local/
三. 安装mysql(二进制安装)
1. 创建操作系统用户
XML/HTML代码
  1. groupadd mysql
  2. useradd -g mysql mysql
注意:这里可以是其它用户名
2. 解压包建立软连接
XML/HTML代码
  1. cd /usr/local/
  2. ln -s mysql-8.0.33-linux-glibc2.17-x86_64-minimal/ mysql
  3. chown -R mysql.mysql /usr/local/mysql
  4. chown -R mysql.mysql /usr/local/mysql-8.0.33-linux-glibc2.17-x86_64-minimal/
3. 编辑配置文件
XML/HTML代码
  1. vim /etc/my.cnf
增加配置文件
XML/HTML代码
  1. [client]
  2. socket=/data/mysql/data/mysql.sock
  3. port=3306
  4.  
  5. [mysqld]
  6.  
  7. #dir
  8. basedir=/usr/local/mysql
  9. datadir=/data/mysql/data
  10. socket=/data/mysql/data/mysql.sock
  11. log_error=/data/mysql/data/mysql.err
  12. pid-file =/data/mysql/data/mysql.pid
  13.  
  14. #server_info
  15. server-id=1
  16. user=mysql
  17. log_timestamps=system
  18.  
  19. #connection_info
  20. #最大连接数
  21. max_connections = 3000
  22. #最大错误连接数
  23. max_connect_errors = 10000
  24. #MySQL默认的wait_timeout  值为8个小时, interactive_timeout参数需要同时配置才能生效
  25. interactive_timeout = 3600
  26. wait_timeout = 3600
  27.  
  28. #字符集
  29. character-set-server = utf8mb4
  30. #只能用IP地址检查客户端的登录,不用主机名
  31. skip_name_resolve = 1
  32.  
  33. #binlog
  34. binlog_format = ROW
  35. #如果设置为MINIMAL,则会减少记录日志的内容,只记录受影响的列,但对于部分update无法flashBack
  36. binlog_row_image = FULL
  37. #一般数据库中没什么大的事务,设成1~2M,默认32kb
  38. binlog_cache_size = 4M
  39. #binlog 能够使用的最大cache 内存大小
  40. max_binlog_cache_size = 2G
  41. #单个binlog 文件大小 默认值是1GB
  42. max_binlog_size = 1G
  43. #binlog 过期天数7
  44. #expire_logs_days = 7
  45. binlog_expire_logs_seconds = 604800
  46.  
  47. #GTID
  48. gtid_mode = on
  49. enforce_gtid_consistency = 1
  50.  
  51. #innodb_buffer
  52. #一般设置物理存储的 50% ~ 70%
  53. innodb_buffer_pool_size = 8G
  54. #当缓冲池大小大于1GB时,将innodb_buffer_pool_instances设置为大于1的值,可以提高繁忙服务器的可伸缩性
  55. innodb_buffer_pool_instances = 8
  56. #双一刷盘设置
  57. #控制 innodb_flush_log_at_trx_commit redolog 写磁盘频率  sync_binlog 默认为1 #控制 binlog 写磁盘频率
  58. innodb_flush_log_at_trx_commit = 1
  59. sync_binlog = 1
  60. #从库binlog控制
  61. log_replica_updates = ON
  62. #自增ID设置(1,2) 另一台设置为 (2,2)
  63. auto_increment_offset = 1
  64. auto_increment_increment = 2
  65.  
  66. # 表名SQL大小写(是否对sql语句大小写敏感,1表示不敏感 0 )
  67. lower_case_table_names = 1
  68.  
  69. #Replication
  70. master_info_repository =TABLE
  71. relay_log_info_repository =TABLE
  72. #super_read_ony =ON
  73. binlog_transaction_dependency_tracking =WRITESET
  74. transaction_write_set_extraction =XXHASH64
  75.  
  76. #Multi-threaded Replication
  77. replica_parallel_type =LOGICAL_CLOCK
  78. replica_preserve_commit_order =ON
  79. replica_parallel_workers = 4
  80.  
  81. #是否启用慢查询日志,1为启用,0为禁用
  82. slow_query_log = 1
  83. #指定慢查询日志文件的路径和名字
  84. slow_query_log_file =/data/mysql/data/slow.log
  85. #慢查询执行的秒数,必须达到此值可被记录
  86. long_query_time = 1
  87. #将没有使用索引的语句记录到慢查询日志
  88. log_queries_not_using_indexes = 0
  89. #设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间
  90. log_throttle_queries_not_using_indexes = 60
  91. #对于查询扫描行数小于此参数的SQL,将不会记录到慢查询日志中
  92. min_examined_row_limit = 5000
  93. #记录执行缓慢的管理SQL,如alter table,analyze table, check table, create index, drop index, optimize table, repair table等。
  94. log_slow_admin_statements = 0
  95.  
  96. [mysqldump]
  97. quick
  98. max_allowed_packet = 512M
4. 创建数据目录 并修改其属主和组
XML/HTML代码
  1. mkdir -p /data/mysql/data
  2. chown -R mysql.mysql /data/mysql
  3. chown -R mysql.mysql /data/mysql/data
5. 初始化数据库实例
XML/HTML代码
  1. /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize
6. 启动实例
XML/HTML代码
  1. /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf & 
  2. ps -ef |grep mysql
7. 登录实例
* 找初始实例日志的临时密码
XML/HTML代码
  1. grep password /data/mysql/data/mysql.err
* 登录数据库
XML/HTML代码
  1. /usr/local/mysql/bin/mysql -uroot -p
* 登陆后必须修改密码
XML/HTML代码
  1. mysql> alter user user() identified by 'xxxxxxxx';
* 安装密码策略控件
XML/HTML代码
  1. -- mysql 8.0
  2. select * from mysql.component ;
  3. install component 'file://component_validate_password';
8. 以服务方式启动
XML/HTML代码
  1. cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
  2.  
  3. vim /etc/init.d/mysqld
  4. -- modify basedir  and datadir
  5. basedir=/usr/local/mysql
  6. datadir=/data/mysql/data
  7.  
  8. # 重新载入
  9. systemctl daemon-reload
  10. # 设置开机自启动
  11. systemctl enable mysqld
  12.  
  13. # 重启mysql 服务
  14. systemctl status mysqld
  15. systemctl restart mysqld
  16. systemctl stop   mysqld
  17. systemctl start  mysqld
9. 配置环境变量
XML/HTML代码
  1. vim /etc/profile     -- 编辑 所有用户的变量  对所有用户登录的环境变量可用
  2. export PATH=$PATH:/usr/local/mysql/bin
  3. source /etc/profile
10. 登录数据
XML/HTML代码
  1. [root@centos7-2 bin]# mysql -uroot -p
  2. Enter password:
  3. Welcome to the MySQL monitor.  Commands end with ; or \g.
  4. Your MySQL connection id is 8
  5. Server version: 8.0.33 MySQL Community Server - GPL
  6. Copyright (c) 2000, 2024, Oracle and/or its affiliates.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h'forhelp. Type '\c' to clear the current input statement.
  11.  
  12. mysql>
四.基于GTID 搭建MySQL复制
注意事项:server-id 两台服务器一定要设置成不同ID
1. 在主库建立 数据同步的账号
XML/HTML代码
  1. CREATEUSER'repl_user'@'10.28.3.19%'IDENTIFIEDBY'XXXXXXXX';
  2. GRANTreplicationslaveON *.* TO'repl_user'@'10.28.3.19%';
  3. FLUSHPRIVILEGES;
2. 在从库执行 设置主库命令
XML/HTML代码
  1. changemasterto
  2. master_host='10.28.3.195',
  3. master_port=3306,
  4. master_user='repl_user',
  5. master_password='XXXXXXXX',
  6. master_auto_position=1,
  7. master_connect_retry=30,
  8. get_master_public_key=1;
3. 开启 复制 并查看复制状态
XML/HTML代码
  1. startslave;
  2. showslavestatus\G;
五.安装Keepalived
1. yum安装
XML/HTML代码
  1. yum  install -y  Keepalived
2. 配置服务
XML/HTML代码
  1. systemctl enable keepalived
  2. systemctl daemon-reload
3. 配置文件修改
XML/HTML代码
  1. mv /etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf.old
  2. vim /etc/keepalived/keepalived.conf
修改配置文件
XML/HTML代码
  1. # 全局配置
  2. global_defs {
  3.     # 身份识别(全局唯一)
  4.     router_id lb01
  5. }
  6. vrrp_script check_mysql {
  7.     #这里通过脚本监测
  8.     script "/data/keepalived/check_mysql.sh"
  9.     interval 5                #脚本执行间隔,每5s检测一次
  10.     weight -5                 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
  11.     fall 1                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
  12.     rise 1                    #检测1次成功就算成功。但不修改优先级
  13. }
  14. # 配置vrrp协议(相互探测 假设有一Keepalived宕机 它会立马把VIP切换到另一台机器)
  15. vrrp_instance VI_MYSQL {
  16.     # 绑定网卡(所用vip必须是当前机器的网卡所在的网段里的 eth0/eth1里面)
  17.     interface eth0
  18.     # 状态master主节点(这里仅仅是一个标记,真正确认VIP的是权重) 主服务器配置为MASTER,从服务器配置为BACKUP
  19.     state MASTER
  20.     virtual_router_id 50
  21.     # 优先级(数字越大 权重越大) 主服务器优先级高于从服务器
  22.     priority 100
  23.     # 检测心跳间隔时间
  24.     advert_int 1
  25.     authentication {
  26.         auth_type PASS
  27.         auth_pass 123456  # 验证密码
  28.     }
  29.     virtual_ipaddress {
  30.         10.28.3.194  # 虚拟IP地址,用于连接数据库
  31.     }
  32.     track_script {
  33.         check_mysql
  34.     }
  35. }
配置监测MYSQL运行脚本/data/keepalived/check_mysql.sh
XML/HTML代码
  1. mkdir -p /data/keepalived/
  2. vim /data/keepalived/check_mysql.sh
  3.  
  4. #!/bin/bash
  5.  
  6. # 检查MySQL服务是否在运行  给一次机会看2后是MYSQL又开始运行
  7. counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
  8. if [ "${counter}" -eq 0 ]; then
  9.         sleep 2;
  10.     counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
  11.     if [ "${counter}" -eq 0 ]; then
  12.         killall keepalived
  13.     fi
  14. fi
注意 需要给 /data/keepalived/check_mysql.sh 脚本为授权。
XML/HTML代码
  1. chmod u+x /data/keepalived/check_mysql.sh
4. 启动keepAlived
XML/HTML代码
  1. systemctl start keepalived
5. 验证keepAlived
XML/HTML代码
  1. # 验证前提 需要 两台服务器 的mysql 和 keepalived 服务 在正常可用的状态下。
  2. # 在master1上执行。
  3. systemctl stop mysqld
  4. # 在其另一台执行ip a  看看虚拟ip 是否切换到另外节点
  5. ip a
六.建立管理员账号
**建立dbadmin账号 **
XML/HTML代码
  1. CREATE USER 'dbadmin'@'%' IDENTIFIED BY 'xxxxxxxx';
  2. GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'%' with GRANT OPTION;
  3. FLUSH PRIVILEGES;
七.账号密码信息
密码信息
XML/HTML代码
  1. 账号        密码    是否可修改密码    权限          备注
  2. root      xxxxxxxx     是       本地管理账号    只能本机登录
  3. dbadmin   xxxxxxxx     是       远程管理员账号  可远程登录
  4. repl_user xxxxxxxx     是       主从复制账号    需要停止复制才可以修改密码,修改后需要重新指定主从账号密码。
MYSQL 备份实战
备份需求:
每日凌晨2时对数据做有一次全备,包含binlog,需要对备份文件远程存放。
备份备份历史文件本地保留7日,远程目录保留3个月。
实现步骤:
1.全库备份脚本
2.binlog 备份脚本
3.压缩和同步脚本
4.配置定时任务
示例脚本如下:
XML/HTML代码
  1. #!/bin/bash
  2.  
  3. # 定义变量
  4. BACKUP_DIR="/path/to/backup"# 本地备份目录
  5. BINLOG_DIR="/path/to/binlog_backup"# 本地 binlog 备份目录
  6. REMOTE_SERVER="user@remote_server:/remote/backup/directory"# 远程备份服务器及目录(建议提前配置好ssh互信)
  7. MYSQL_USER="your_mysql_user"# MySQL 用户名
  8. MYSQL_PASSWORD="your_mysql_password"# MySQL 用户密码
  9. MYSQL_HOST="localhost"# MySQL 主机地址
  10. MYSQL_PORT="3306"# MySQL 端口号
  11. DATE=$(date +"%Y%m%d%H%M")                 # 当前日期时间,用于创建唯一的备份目录
  12.  
  13. # 创建备份目录
  14. mkdir -p $BACKUP_DIR/$DATE
  15. mkdir -p $BINLOG_DIR/$DATE
  16.  
  17. # 全备份
  18. echo"Starting full backup..."
  19. mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD -h $MYSQL_HOST -P $MYSQL_PORT --all-databases > $BACKUP_DIR/$DATE/full_backup.sql
  20. if [ $? -eq 0 ]; then
  21.   echo"Full backup successful!"
  22. else
  23.   echo"Full backup failed!"
  24.   exit 1
  25. fi
  26.  
  27. # binlog 备份
  28. echo"Starting binlog backup..."
  29. mysqladmin -u $MYSQL_USER -p$MYSQL_PASSWORD flush-logs
  30. cp /data/mysql/binlog/mysql-bin.* $BINLOG_DIR/$DATE#找到binlog文件位置
  31. if [ $? -eq 0 ]; then
  32.   echo"Binlog backup successful!"
  33. else
  34.   echo"Binlog backup failed!"
  35.   exit 1
  36. fi
  37.  
  38. # 压缩备份文件
  39. echo"Compressing backup files..."
  40. tar -czf $BACKUP_DIR/$DATE/full_backup.tar.gz -C $BACKUP_DIR/$DATE full_backup.sql
  41. tar -czf $BINLOG_DIR/$DATE/binlog_backup.tar.gz -C $BINLOG_DIR/$DATE .
  42. if [ $? -eq 0 ]; then
  43.   echo"Compression successful!"
  44. else
  45.   echo"Compression failed!"
  46.   exit 1
  47. fi
  48.  
  49. # 同步到远程服务器
  50. echo"Syncing backups to remote server..."
  51. rsync -avz $BACKUP_DIR/$DATE/full_backup.tar.gz $REMOTE_SERVER
  52. rsync -avz $BINLOG_DIR/$DATE/binlog_backup.tar.gz $REMOTE_SERVER
  53. if [ $? -eq 0 ]; then
  54.   echo"Backup sync successful!"
  55. else
  56.   echo"Backup sync failed!"
  57.   exit 1
  58. fi
  59.  
  60. # 清理本地 7 天前的备份
  61. echo"Cleaning up local backups older than 7 days..."
  62. find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;
  63. find $BINLOG_DIR -type d -mtime +7 -exec rm -rf {} \;
  64.  
  65. # 清理远程 3 个月前的备份
  66. echo"Cleaning up remote backups older than 3 months..."
  67. ssh user@remote_server "find /remote/backup/directory -type f -mtime +90 -exec rm -f {} \;"
  68.  
  69. echo"All backup tasks completed successfully!"
使用说明
变量定义:
XML/HTML代码
  1. BACKUP_DIR:定义本地全备份的存储目录。
  2. BINLOG_DIR:定义本地 binlog 备份的存储目录。
  3. REMOTE_SERVER:定义远程服务器的用户名、地址和备份目录。
  4. MYSQL_USER:定义 MySQL 用户名。
  5. MYSQL_PASSWORD:定义 MySQL 用户密码。
  6. MYSQL_HOST:定义 MySQL 主机地址。
  7. MYSQL_PORT:定义 MySQL 端口号。
  8. DATE:获取当前日期时间,用于创建唯一的备份目录。
备份操作:
XML/HTML代码
  1. 创建备份目录:使用 mkdir 命令创建用于存储全备份和 binlog 备份的目录。
  2. 全备份:使用 mysqldump 命令进行全备份,并将结果保存到备份目录。
  3. binlog 备份:使用 mysqladmin flush-logs 刷新 binlog,然后使用 cp 命令将 binlog 文件拷贝到备份目录。
  4. 压缩备份文件:使用 tar 命令压缩全备份和 binlog 备份文件。
  5. 同步到远程服务器:使用 rsync 命令将压缩的备份文件同步到远程服务器。
清理旧备份:
XML/HTML代码
  1. 清理本地备份:使用 find 命令删除本地 7 天前的备份。
  2. 清理远程备份:使用 ssh 和 find 命令删除远程 3 个月前的备份。
配置定时任务
使用 cron 配置定时任务,确保脚本在指定时间运行:
XML/HTML代码
  1. # 编辑 cron 任务
  2. crontab -e
  3.  
  4. # 添加以下内容,每天两点进行备份
  5. 0 2 * * * /path/to/backup_script.sh
保存并退出后,cron 会在每天凌晨两点自动执行备份脚本。根据实际情况调整脚本中的路径和变量。

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):