登录
  • 欢迎访问悠扬的技术博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站😉

Mysql高可用集群搭建(一)一主两从服务搭建

Mysql 悠扬 816次浏览 已收录 0个评论

1. 话不多说直接先看版本

Mysql高可用集群搭建(一)一主两从服务搭建

安装前确认环境
$ rpm -qa | grep mariadb
$ rpm -e -v --nodeps mariadb-libs-5.5.68-1.el7.x86_64

Mysql高可用集群搭建(一)一主两从服务搭建

2. 安装配置

先说明,我三台机器的IP配置如下:

192.168.32.128 
192.168.32.129 
192.168.32.130

创建目录先把文件上传,mysql 和node 安装包每个节点均需拷贝,manager 包只拷贝到manager 节点即可,我都放了,因为我复制的时候没想好那个节点做manager。 :lol: 

//在三台机器上面执行
$ mkdir -p /home/local/mysql
//开启防火墙端口 
$ firewall-cmd --add-port=3306/tcp --permanent 
$ firewall-cmd --reload 
//关闭selinux 
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
$ setenforce 0

添加用户

$ groupadd mysql
$ useradd -r -g mysql mysql

3. 解压安装mysql

$ mkdir -p /usr/local/mysql/{data,log}
//用自己的的上传路径
$ tar -xvf /home/local/mysql/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz -C /usr/local/mysql/ --strip-components 1
备注: 
-C表示解压指定目录如:当前目录/usr/local/mysql/
--strip-components N 表示删除目录结构(n=1表示删除最外层结构)

查看MySQL文件内容,别跳着走,跟着我的节奏

$ ll /usr/local/mysql/

Mysql高可用集群搭建(一)一主两从服务搭建

3.1 设置开机启动

$ cp -a /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
$ chmod +x /etc/rc.d/init.d/mysqld
$ chkconfig --add mysqld
$ chkconfig --list

3.2 设置/etc/profile配置文件

$ vi /etc/profile
//加在文件最后
$ export PATH=$PATH:/usr/local/mysql/bin
$ source /etc/profile
//配置完看看环境变量
$ echo $PATH

Mysql高可用集群搭建(一)一主两从服务搭建

3.3 修改my.cnf 文件

vim /etc/my.cnf

注意 :以下内容必须全部拷贝, 包括[mysqld]

[mysqld]
#默认存储引擎InnoDB
default-storage-engine = InnoDB
#用户
#user = mysql
#监听端口  
port = 3306
#socket通信设置,注意这个文件随着mysql启动创建,一般情况下是在/tmp/下,但是有些进程会清理
socket = /tmp/mysql.sock
#mysql的安装目录
basedir = /usr/local/mysql
#pid目录
pid-file = /usr/local/mysql/mysql.pid
#数据文件位置
datadir = /usr/local/mysql/data
#允许最大连接数
max_connections = 18192
# mysql 定时清理日志文件
expire_logs_days=10
#等待关闭连接时间
wait_timeout = 600
#服务端字符集
character-set-server = utf8mb4
#错误日志
log-error = /usr/local/mysql/log/error.log
#不区分大小写
lower_case_table_names = 1
#group by
sql_mode=’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’

3.4 初始化无密码登录密码、授权

$ /usr/local/mysql/bin/mysqld --initialize-insecure
$ chown -R mysql.mysql /usr/local/mysql
$ chmod -R 777 /usr/local/mysql

3.5 启动及查看日志

$ service mysqld start
$ tail -f /usr/local/mysql/log/error.log

3.6 登录修改密码,安装半同步插件

随机密码生成

cat /dev/urandom | LC_ALL=C tr -dc "[:graph:]" | fold -w 10 |head -2 > ./shard.key
$ mysql -uroot -p
$ ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Root2020@';
$ CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root2020@';
$ GRANT ALL ON *.* TO 'root'@'%';
$ FLUSH PRIVILEGES;
//开始安装半同步插件
$ install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
$ install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';

创建同步用户,MHA用户与数据半同步用户一起创建,在每台机器都需要执行,我这是开发环境,生成环境请改密码,被黑了,可别来找我 :lol:注意: 别写成我的IP导致最后通信失败了  :D 

mysql -uroot -pRoot2020@

use mysql;
select user,host from user;
CREATE USER 'repl'@'192.168.32.%' IDENTIFIED BY 'Root2020@';
ALTER USER 'repl'@'192.168.32.%' IDENTIFIED WITH mysql_native_password BY 'Root2020@';
grant replication slave on *.* to repl@'172.168.9.%';

CREATE USER 'manager'@'192.168.32.%' IDENTIFIED BY 'Root2020@';
grant all on *.* to manager@'192.168.32.%';
ALTER USER 'manager'@'192.168.32.%' IDENTIFIED WITH mysql_native_password BY 'Root2020@';
FLUSH PRIVILEGES;

以上操作在三台机器需要全部完成,操作完成后进行主从数据半同步测试

4.数据半同步配置

修改三台机器的my.cnf配置数据半同步,在文件尾追加增加如下配置:

#server_id 每台机器需要不同,随机,自增都可以 
//以下配置拷贝至128节点my.cnf #master节点
server_id = 1
log-bin = mysql-bin
binlog_format=mixed
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = 1
relay_log_purge = 0
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
//以下配置拷贝至129节点my.cnf
#slave 1 主机新增以下配置,这个节点用来做master高可用切换
server_id = 2
log-bin = mysql-bin
binlog_format = mixed
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = 1
relay_log_purge = 0
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
//以下配置拷贝至130节点my.cnf
server_id=3
log-bin = mysql-bin
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
rpl_semi_sync_slave_enabled = 1

配置完成后重启服务,这里有个中继日志,用来干啥,在集群恢复的时候详细说

查看半同步状态

mysql -uroot -pRoot2020@

show variables like '%rpl_semi_sync%'; 
show status like '%rpl_semi_sync%';

#关于上个命令查看到的信息,有几个状态值得关注,将在下面写下来
rpl_semi_sync_master_status :显示主服务是异步复制模式还是半同步复制模式,ON为半同步;
rpl_semi_sync_master_clients :显示有多少个从服务器配置为半同步复制模式;
rpl_semi_sync_master_yes_tx :显示从服务器确认成功提交的数量
rpl_semi_sync_master_no_tx :显示从服务器确认不成功提交的数量
rpl_semi_sync_master_tx_avg_wait_time :事务因开启 semi_sync ,平均需要额外等待的时间
rpl_semi_sync_master_net_avg_wait_time :事务进入等待队列后,到网络平均等待时间

4.1 创建主从半同步

登录master主机,我现在定了就128啦
$ mysql -uroot -pRoot2020@
$ show master status\G;

Mysql高可用集群搭建(一)一主两从服务搭建

在129,130执行从节点配置与主节点建立关联

mysql -uroot -pRoot2020@

change master to 
master_host='192.168.32.128',
master_port=3306,
master_user='repl',
master_password='Root2020@',
master_log_file = 'mysql-bin.000001',
master_log_pos=156,
get_master_public_key=1;

start slave;
FLUSH PRIVILEGES;

配置完成后重启服务,查看节点配置

Mysql高可用集群搭建(一)一主两从服务搭建

看到如下状态服务半同步主从建立成功

看到主节点注册成功两个从节点

Mysql高可用集群搭建(一)一主两从服务搭建

看到两个从节点状态正常

Mysql高可用集群搭建(一)一主两从服务搭建

可能遇到的问题,及解决方案

Q1: Slave_IO_Running:Connecting;Slave_SQL_Running:Yes ?
A1: 从几个点来排除:具体问题具体分析
 1.网络不通 
 2.账户密码错误 
 3.防火墙 
 4.mysql配置文件问题  
 5.主服务器mysql权限
 6.创建slave关联时IP错误,或者配置错误

Q2:Slave_IO_Running:No;
   The slave I/O thread stops because master and slave have equal MySQL server UUIDs ?
  这个问题是我自己把虚拟机做克隆,mysql的UUID搞成一样的了,所以注册不过去,解决办法:
 vim /usr/local/mysql/data/auto.cnf
 修改UUID,重启服务

Q3: 遇见问题不要慌,仔细看看那里配置出错了,具体问题具体分析。

5.mysql 主从数据不一致,提示: Slave_SQL_Running: No 的解决方法

在slave服务器上通过如下命令

mysql> show slave status\G;

显示如下情况:表示slave不同步

Slave_IO_Running: Yes
Slave_SQL_Running: No

解决方法一(忽略错误,继续同步):

  1. 先停掉slave
          mysql> stop slave;
  2. 跳过错误步数,后面步数可变
         mysql> set global sql_slave_skip_counter=1;
  3. 再启动slave
         mysql> start slave;
  4. 查看同步状态
        mysql> show slave status\G;

解决方法二(重新做主从,完全同步):

  1. 先进入主库进行锁表,注意窗口不要关闭
      mysql> flush table with read lock;
  2. 把数据进行备份
    mysqldump -uroot -p –opt -R 数据库 > /data/bak.sql
  3. 再新开个窗口,查看主数据库信息
      mysql> show master status;
    +——————+———-+————–+——————+——————-+
    | File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +——————+———-+————–+——————+——————-+
    | mysql-bin.000005 |   1158 |       |         |          |
    +——————+———-+————–+——————+——————-+
  4. 在从库上停止slave
    mysql> stop slave;
  5. 导入备份的数据文件
    mysql> source /data/bak.sql
  6. 重置同步
    mysql> reset slave;
  7. 重新设置同步节点
    host,port,user,password请根据你的主库设置相应修改,log_file和log_pos根据主库中master status相应修改。

    mysql> CHANGE MASTER TO
    MASTER_HOST=’192.168.137.233′,
    MASTER_PORT=3306,
    MASTER_USER=’sync’,
    MASTER_PASSWORD=’123456′,
    MASTER_LOG_FILE=’mysql-bin.000005′,
    MASTER_LOG_POS=1158;

  8. 开启slave
    mysql> start slave;
  9. 查看slave状态
    mysql> show slave status\G;
    显示如下信息则表示正常Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
  10. 对主数据库解锁
    mysql> unlock tables;

 


版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Mysql高可用集群搭建(一)一主两从服务搭建
喜欢 (1)
支付宝[]
分享 (0)
悠扬
关于作者:
10年以上工作经验,从事2年微服务架构搭建工作,有大数据处理相关工作经验,使用spring全家桶包括:Spring,SpringBoot,SpringCloud 数据层组件服务使用SpringDataJpa,Mybatis以及其他第三方组件Sharding-JDBC,Sharding-Proxy分库分表。熟悉微服务,服务降级,限流,分流,做过项目源码修改,有cat,apollo,nacos使用经验,有Lostash,Elasticsearch,kibana,mysqlMHA生产实践经验,使用开源代码Apache Sarding项目,修改源码支持mysql分库分表使用年月日小时分库分表,docker做集群服务,Jekins做项目发布,GitLab做项目管理,使用docker容器部署,熟悉消息队列RabbitMQ,Kafka,ActiveMQ。RuoYi-Vue-Atomikos项目开源加入生态圈组件,项目支持分布式事务,界面添加多数据源,数据源动态配置,切面切换,多数据源事务支持,支持区域数据源配置,用于区域数据切分,数据层次分库。项目地址:https://gitee.com/zsiyang/ruoyi-vue-atomikos
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址