MySQL:(十三)MySQL高可用

MySQL:(十三)MySQL集群其二

(一)关系型数据库基础
(二)MySQL安装
(三)管理数据库和表
(四)用户和权限管理
(五)函数,存储过程和触发器
(六)MySQL架构
(七)存储引擎
(八)MySQL服务器选项,系统和状态变量
(九)优化查询和索引管理
(十)锁和事务管理
(十一)日志管理
(十二)备份还原
(十三)MySQL集群

MySQL读写分离

读写分离应用

  • mysql-proxy:Oracle,https://downloads.mysql.com/archives/proxy/
  • Atlas:Qihoo,https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
  • dbproxy:美团,https://github.com/Meituan-Dianping/DBProxy
  • Cetus:网易乐得,https://github.com/Lede-Inc/cetus
  • Amoeba:https://sourceforge.net/projects/amoeba/
  • Cobar:阿里巴巴,Amoeba的升级版
  • Mycat:基于Cobar, http://www.mycat.io/
  • ProxySQL:https://proxysql.com/

ProxySQL

ProxySQL简介

  • ProxySQL: MySQL中间件 两个版本:官方版和percona版,percona版是基于官方版基础上修改
    • C++语言开发,轻量级但性能优异(支持处理千亿级数据)
    • 具有中间件所需的绝大多数功能,包括: 多种方式的读/写分离
      • 定制基于用户、基于schema、基于语句的规则对SQL语句进行路由
      • 缓存查询结果
      • 后端节点监控
  • 官方站点:https://proxysql.com/
  • 官方手册:https://github.com/sysown/proxysql/wiki

ProxySQL安装

  • 准备:
    • 实现读写分离前,先实现主从复制
    • 注意:slave节点需要设置read_only=1
  • 基于YUM仓库安装
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
  • 基于RPM下载安装:https://github.com/sysown/proxysql/releases

ProxySQL软件

  • ProxySQL组成

    • 服务脚本:/etc/init.d/proxysql
    • 配置文件:/etc/proxysql.cnf
    • 主程序:/usr/bin/proxysql
    • 基于SQLITE的数据库文件:/var/lib/proxysql/
      proxySQL本身也是一个小型的数据库,SQLLITE是一个小型的SQL数据库。
  • 启动ProxySQL:service proxysql start

    • 启动后会监听两个默认端口
    • 6032:ProxySQL的管理端口
    • 6033:ProxySQL对外提供服务的端口
  • 使用mysql客户端连接到ProxySQL的管理接口6032,默认管理员用户和密码都是admin:

    • mysql -uadmin -padmin -P6032 -h127.0.0.1

ProxySQL数据库说明

  • SQLITE的数据库说明:

    • main是默认的数据库名,表里存放后端db实例、用户验证、路由规则等信息。表名以runtime_开头的表示proxysql当前运行的配置内容

      • 修改方式:不能通过dml语句修改,只能①修改对应的不以runtime_ 开头的(在内存)里的表,②然后LOAD使其生效,③SAVE使其存到硬盘以供下次重启加载。
    • disk是持久化到硬盘的配置,sqlite数据文件

    • stats是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间,等等

    • monitor库存储monitor模块收集的信息,主要是对后端db的健康/延迟检查

    • 其中main、disk、stats、monitor是安装proxysql默认自带的数据库

  • 修改runtime_运行配置说明:

    • 在main和monitor数据库中的表, runtime_开头的是运行时的配置,不能修改,只能修改非runtime_表

    • 修改后必须执行LOAD … TO RUNTIME才能加载到RUNTIME生效

    • 执行save … to disk 才将配置持久化保存到磁盘,即保存在proxysql.db文件中

    • global_variables 有许多变量可以设置,其中就包括监听的端口、管理账号等

    • 参考: https://github.com/sysown/proxysql/wiki/Global-variables

ProxySQL实现读写分离中proxysql配置

【1.添加MySQL节点】

  • 向ProxySQL中添加MySQL节点,以下操作不需要use main也可成功
    • MySQL > show tables;
    • MySQL > select * from sqlite_master where name=‘mysql_servers’\G
    • MySQL > select * from mysql_servers;
    • MySQL > insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.38.17’,3306);
    • MySQL > insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.38.27’,3306);
    • MySQL > load mysql servers to runtime;
    • MySQL > save mysql servers to disk;

【2.在MySQL节点创建一个供proxysql连接的账户】

  • 添加监控后端节点的用户。ProxySQL通过每个节点的read_only值来自动调整它们是属于读组还是写组

  • 在master上执行

    • MySQL> grant replication client on *.* to monitor@‘192.168.8.%’ identified by ‘centos’;

【3.将2中账户添加至proxysql中】

  • ProxySQL上配置监控
    • MySQL [(none)]> set mysql-monitor_username=‘monitor’;
    • MySQL [(none)]> set mysql-monitor_password=‘centos’;
  • 加载到RUNTIME,并保存到disk
    • MySQL [(none)]> load mysql variables to runtime;
    • MySQL [(none)]> save mysql variables to disk;

【4.添加监控账户后可查询是否配置成功,能否连接至mysql节点】

  • 监控模块的指标保存在monitor库的log表中
  • 查看监控连接是否正常的 (对connect指标的监控):
    • 如果connect_error的结果为NULL则表示正常
    • MySQL> select * from mysql_server_connect_log;
  • 查看监控心跳信息 (对ping指标的监控):
    • MySQL> select * from mysql_server_ping_log;

【5.创建读组写组相关信息】

  • 设置分组信息
    • 需要修改的是main库中的mysql_replication_hostgroups表,该表有3个字段:writer_hostgroup,reader_hostgroup,comment, 指定写组的id为10,读组的id为20

    • 查看main库中的mysql_replication_hostgroups表结构:
      MySQL [(none)]> select * from sqlite_master where name=‘mysql_replication_hostgroups’\G

    • *MySQL> insert into mysql_replication_hostgroups values(10,20,“test”);*将mysql_replication_hostgroups表的修改加载到RUNTIME生效

    • MySQL> load mysql servers to runtime;

    • MySQL> save mysql servers to disk;

    • Monitor模块监控后端的read_only值,按照read_only的值将节点自动移动到读/写组

    • MySQL> select hostgroup_id,hostname,port,status,weight from mysql_servers;

【6.创建一个可以远程连接数据库账户】

  • 配置发送SQL语句的用户
  • 在master节点上创建访问用户
    • MySQL> grant all on *.* to sqluser@‘192.168.38.%’ identified by ‘centos’;

【7.将连接账户添加至proxysql中,让其能够通过此账户连接mysql】

  • 在ProxySQL配置,将用户sqluser添加到mysql_users表中, default_hostgroup默认组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库
    • MySQL> insert into mysql_users(username,password,default_hostgroup) values(‘sqluser’,‘centos’,10);
    • MySQL> load mysql users to runtime;
    • MySQL> save mysql users to disk;

【8.连接测试查看当前连接在哪个mysql节点】

  • 使用sqluser用户测试是否能路由到默认的10写组实现读、写数据
    • mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘select @@server_id’
MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          17 |
+-------------+
MySQL [(none)]> status;
....
Connection:		192.168.38.47 via TCP/IP
...

目前并未实现读写分离,所有请求均发送给master节点了(10组)

【9.定义读写分离规则,将查询仅发送给slave】

  • 在proxysql上配置路由规则,实现读写分离

  • 与规则有关的表:mysql_query_rules和mysql_query_rules_fast_routing,后者是前者的扩展表,1.4.7之后支持

  • 插入路由规则:将select语句分离到20的读组,select语句中有一个特殊语句

    • SELECT…FOR UPDATE它会申请写锁,应路由到10的写组
    • MySQL> insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)VALUES (1,1,’^SELECT.*FOR UPDATE$’,10,1),(2,1,’^SELECT’,20,1);
    • MySQL> load mysql query rules to runtime;
    • MySQL> save mysql query rules to disk;
  • ==注意:==因ProxySQL根据rule_id顺序进行规则匹配,select … for update规则的rule_id必须要小于普通的select规则的rule_id

【测试:读写分离】

  • 测试读操作是否路由给20的读组
    • # mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘select @@server_id’
  • 测试写操作,以事务方式进行测试
    • mysql -usqluser -pcentos -P6033 -h127.0.0.1 \ -e ‘start transaction;select @@server_id;commit;select @@server_id’
    • mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘insert testdb.t values (1)’
    • mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e ‘select id from testdb.t’
  • 路由的信息:查询stats库中的stats_mysql_query_digest表
    • MySQL > SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;

读写分离实验

【1.实验架构】

【2.实验规划】

  • OS:centos7.6
  • user:192.168.38.57
  • proxy:192.168.38.47
  • master:192.168.38.17
  • slave:192.168.38.27

【3.主从实现】

  • 实现详情看mysql复制,此处略
  • 注意:slave节点需要设置read_only=1

【4.proxy配置】

安装软件:proxysql 1.4版本

cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF

    需要联网
# yum install proxysql -y  

    安装mysql客户端,管理连接proxysql使用
# yum install mariadb -y

# rpm -ql proxysql 
/etc/init.d/proxysql     启动脚本,因此只能使用service启动
/etc/proxysql.cnf        proxy配置文件,只是现在,第一次启动之前能生效,一旦服务启动成功,配置文件就无效啦,所有的配置均放在数据库中了。
/usr/bin/proxysql 
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl

    修改对外提供的端口:6033 ==> 3306 
# vim /etc/proxysql.cnf  

    启动proxysql
# service proxysql start

    管理连接
# mysql -uadmin -padmin -P6032 -h127.0.0.1  只允许本地连接
MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |对应一个磁盘文件
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
MySQL [(none)]> show tables; 

【5.读写分离的实现】

proxysql_server:master
1.将mysql-server添加至mysql_servers表中
insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.38.27’,3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,‘192.168.38.17’,3306);
检查:select * from mysql_servers;
load mysql users to runtime;save mysql users to disk;
--
创建一个供proxysql连接的账户
grant replication client on . to monitor@‘192.168.38.%’ identified by ‘centos’;
将monitor用户添加至proxysql中
set mysql-monitor_username=‘monitor’;
set mysql-monitor_password=‘centos’;
load mysql variables to runtime;save mysql variables to disk;
实际修改的是global_variables这个表
检查前面步骤是否成功:
select * from mysql_server_ping_log;
--
添加读组写组
insert into mysql_replication_hostgroups values(10,20,“test”);
load mysql users to runtime;save mysql users to disk;
--
创建一个远程连接账户、
grant all on . to sqluser@‘192.168.38.%’ identified by ‘centos’;
将连接账户添加至proxysql中,让其能够通过此账户连接mysql
insert into mysql_users(username,password,default_hostgroup) values(‘sqluser’,‘centos’,10);
load mysql users to runtime;save mysql users to disk;
添加时定义了规则,此时远程主机的请求只会往10组的主机发
检查前面步骤是否成功:select hostgroup_id,hostname,port,status,weight from mysql_servers;
--
添加规则,将查询语句分离出来发送给20组的mysql节点即slave节点
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)VALUES (1,1,’^SELECT.*FOR UPDATE$’,10,1),(2,1,’^SELECT’,20,1);
load mysql users to runtime;save mysql users to disk;
至此读写分离配置完成啦~

【6.客户端测试】

# mysql -usqluser -pcentos -h192.168.38.47
MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          27 |
+-------------+
MySQL [(none)]> create database db2;
MySQL [(none)]> begin;select @@server_id;commit;
+-------------+
| @@server_id |
+-------------+
|          17 |
+-------------+
==> 以事务方式执行将在master上执行。

MySQL高可用

MySQL高可用应用

  • MMM: Multi-Master Replication Manager for MySQL,Mysql主主复制管理器是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)

    • 官网: http://www.mysql-mmm.org
    • https://code.google.com/archive/p/mysql-master-master/downloads
  • MHA:Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从

    • 官网:https://code.google.com/archive/p/mysql-master-ha/
  • Galera Cluster:wsrep(MySQL extended with the Write Set Replication)通过wsrep协议在全局实现复制;任何一节点都可读写,不需要主从复制,实现多主读写

  • GR(Group Replication):MySQL官方提供的组复制技术(MySQL 5.7.17引入的技术),基于原生复制技术Paxos算法,实现了多主更新,复制组由多个server成员构成,组中的每个server可独立地执行事务,但所有读写事务只在冲突检测成功后才会提交

MHA实现MySQL高可用

MHA集群架构


  • MHA会提升一个与master复制日志差比较小的slave(在默认没有指定优先提升哪个slave时)
  • MHA可以快速的提升一个slave成为新的master,但是它在master系统宕机这种情况下可能会丢失部分数据,但是如果master只是MySQL数据进程故障,会利用ssh协议将二进制日志拷贝至从节点,此时数据不会丢失。

MHA工作原理

1.MHA工作原理

  • 1)从宕机崩溃的master保存二进制日志事件(binlog events)
  • 2)识别含有最新更新的slave
  • 3)应用差异的中继日志(relay log)到其他的slave
  • 4)应用从master保存的二进制日志事件(binlog events)
  • 5)提升一个slave为新的master
  • 6)使其他的slave连接新的master进行复制

2.MHA软件

  • MHA软件由两部分组成,Manager工具包和Node工具包

3.Manager工具包主要包括以下几个工具:

  • masterha_check_ssh 检查MHA的SSH配置状况
  • masterha_check_repl 检查MySQL复制状况
  • masterha_manger 启动MHA
  • masterha_check_status 检测当前MHA运行状态
  • masterha_master_monitor 检测master是否宕机
  • masterha_master_switch 故障转移(自动或手动)
  • masterha_conf_host 添加或删除配置的server信息

4.Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:

  • save_binary_logs 保存和复制master的二进制日志

  • apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave

  • filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用此工具)

  • purge_relay_logs 清除中继日志(不会阻塞SQL线程)

  • ==注意:==为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL 5.5的半同步复制

5.自定义扩展:

  • secondary_check_script: 通过多条网络路由检测master的可用性
  • master_ip_ailover_script: 更新Application使用的masterip
  • shutdown_script: 强制关闭master节点
  • report_script: 发送报告
  • init_conf_load_script: 加载初始配置参数
  • master_ip_online_change_script:更新master节点ip地址

6.配置文件:

  • 在MHA中比较关键的是需要写这个配置文件,数据节点的ip和master,slave,当master故障时,优先提升哪个slave为master等等。
  • global配置,为所有的application提供默认配置,指定的是MHA监控的集群,因为MHA可以监控多个主从集群。
  • application配置:为每个主从复制集群,即其中一组主从集群的相关配置。

实现MHA

1.管理节点

  • 在管理节点上安装两个包

    • mha4mysql-manager
    • mha4mysql-node
  • 在管理节点建立配置文件
    # vim /etc/mastermha/app1.cnf
    [server default]
    user=mhauser
    password=centos 此用户名和密码是用来管理和提升一个slave节点的。
    manager_workdir=/data/mastermha/app1/
    manager_log=/data/mastermha/app1/manager.log
    remote_workdir=/data/mastermha/app1/
    ssh_user=root
    repl_user=repluser 主从复制的复制账户和密码
    repl_password=centos
    ping_interval=1 1s钟发送一次监控报文

    [server1]
    hostname=192.168.38.17
    [server2]
    hostname=192.168.38.27
    candidate_master=1 优先提升谁作为新的master
    [server3]
    hostname=192.168.38.37

2.被管理节点

  • 在被管理节点安装

    • mha4mysql-node
  • 实现Master
    vim /etc/my.cnf
    [mysqld]
    log-bin
    server_id=1
    skip_name_resolve=1 MHA建议配置此项或者说必须配置,禁止ip反向解析成名字

    mysql>show master logs
    mysql>grant replication slave on *.* to repluser@‘192.168.38.%’ identified by ‘centos’;
    mysql>grant all on *.* to mhauser@'192.168.38.%’identified by ‘centos’;

  • 实现slave
    vim /etc/my.cnf
    [mysqld]
    server_id=2 不同节点此值各不相同
    log-bin
    read_only
    relay_log_purge=0 不清楚中继日志,中继日志默认过一段时间将会清理中继日志。
    skip_name_resolve=1

    mysql>CHANGE MASTER TO MASTER_HOST=‘MASTER_IP’, MASTER_USER=‘repluser’, MASTER_PASSWORD=‘centos’, MASTER_LOG_FILE=‘mariadb-bin.000001’, MASTER_LOG_POS=245;

3.其他事项

  • 在所有节点实现相互之间ssh key验证

  • Mha验证和启动

    • masterha_check_ssh --conf=/etc/mastermha/app1.cnf
    • masterha_check_repl --conf=/etc/mastermha/app1.cnf
    • masterha_manager --conf=/etc/mastermha/app1.cnf
      **注意:masterha_manager是一个前台执行的命令,**生产环境中可以结合screen放置后台。
  • 排错日志:

    • /data/mastermha/app1/manager.log

MHA实验

【1)实验规划】

  • master ip:192.168.38.17
  • slave1 ip:192.168.38.27
  • slave2 ip:192.168.38.37
  • manager ip:192.168.38.47

【2)搭建主从节点】

  • ①master 和slaves节点先安装数据库:
yum install mariadb-server -y
  • ②master节点配置
# vim /etc/my.cnf
[mysqld]
innodb-file-per-table
log-bin
server_id=17
skip_name_resolve=1

# systemctl start mariadb
# mysql
>grant replication slave on *.*  to repluser@'192.168.38.%' identified by 'centos';
  • ③slave节点配置
# vim /etc/my.cnf
[mysqld]
innodb-file-per-table
log-bin
server_id=27    slave2 的server_id设为37即可    
read-only
relay_log_purge=0
skip_name_resolve=1

# systemctl start mariadb
# mysql
> CHANGE MASTER TO   MASTER_HOST='192.168.38.17',   MASTER_USER='repluser',   MASTER_PASSWORD='centos',   MASTER_PORT=3306,   MASTER_LOG_FILE='mariadb-bin.000001',   MASTER_LOG_POS=245,   MASTER_CONNECT_RETRY=10;
> start slave;

【3)MHA相关的配置】

  • ②所有节点实现相互之间ssh key验证
    • manager,master,slave1,和slave2之间实现ssh
在其中一台主机实现如下操作:
# ssh-keygen 
# ssh-copy-id 127.0.0.1
# scp .ssh/ 192.168.38.17:/root
# scp -r  .ssh/ 192.168.38.17:/root
# scp -r  .ssh/ 192.168.38.27:/root
# scp -r  .ssh/ 192.168.38.37:/root

【4)MHA相关的配置】

  • ①master为MHA提供管理的用户:
>grant all on *.* to mhauser@'192.168.38.%' identified by 'centos';
  • ②软件安装
    • manager安装
      • mha4mysql-manager
      • mha4mysql-node
    • mysql节点安装
      • mha4mysql-node
    • 注意:mha4mysql-manager安装依赖epel源
# yum install mha*.rpm 
  • ③manager的配置文件
    • 配置文件的存放路径都行,此处放置在 /etc/mha.conf
    • 注意账户匹配问题
# vim /etc/mha.conf 
[server default]
user=mhauser
password=centos
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1

[server1]
hostname=192.168.38.17
[server2]
hostname=192.168.38.27
candidate_master=1
[server3]
hostname=192.168.38.37

# masterha_check_ssh --conf=/etc/mha.conf
# masterha_check_repl --conf=/etc/mha.conf
# masterha_manager --conf=/etc/mha.conf 目前是放置前台执行的

【4)测试mha】

  • 在master执行大量的写操作时突然停止mariadb程序
    • # systemctl stop mariadb
  • 查看manager的错误日志 cat /data/mastermha/app1/manager.log如下:
    • 192.168.38.37(192.168.38.37:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.38.27(192.168.38.27:3306)
    • 192.168.38.27(192.168.38.27:3306): Resetting slave info succeeded.
    • Master failover to 192.168.38.27(192.168.38.27:3306) completed successfully.
    • master已经切换为了192.168.38.27
此时mha检测到master故障,将按照配置文件中指定优先提升slave1 ip:27的主机成为新的master
此时slave2将指向新的master
在slave2查询:
> show slave status\G
...
Master_Server_Id: 27

Galera Cluster

Galera Cluster简介

Galera Cluster:集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案。

下图图示:三个节点组成了一个集群,与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,称为multi-master架构,当有客户端要写入或者读取数据时,连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构

Galera Cluster特点

1.**多主架构:**真正的多点读写的集群,在任何时候读写数据,都是最新的

2.**同步复制:**集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失

3.**并发复制:**从节点APPLY数据时,支持并行执行,更好的性能

4.**故障切换:**在出现数据库故障时,因支持多点写入,切换容易

5.**热插拔:**在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小

6.**自动节点克隆:**在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致

7.**对应用透明:**集群的维护,对应用程序是透明的

Galera Cluster工作过程

Galera Cluster

1.Galera Cluster官方文档:

  • http://galeracluster.com/documentation-webpages/galera-documentation.pdf
  • http://galeracluster.com/documentation-webpages/index.html
  • https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/

2.Galera Cluster包括两个组件

  • Galera replication library (galera-3)
  • WSREP:MySQL extended with the Write Set Replication
    • WSREP:一种协议

3.WSREP复制实现:

  • PXC:Percona XtraDB Cluster,是Percona对Galera的实现
  • MariaDB Galera Cluster
    • 参考仓库:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.65/yum/centos7-amd64/

4.注意:都至少需要三个节点,不能安装mariadb-server,与系统安装的mariadb-server是冲突的,安装MariaDB-Galera-server会自动将mariadb-server卸载

Galera Cluster实现

  • yum install MariaDB-Galera-server
  • vim /etc/my.cnf.d/server.cnf
    [galera]
    wsrep_provider = /usr/lib64/galera/libgalera_smm.so 启用galera模块,安装MariaDB-Galera-server时会自动生成此模块
    wsrep_cluster_address=“gcomm://192.168.38.17,192.168.38.27,192.168.38.37” 说明galera-cluster的集群节点分别有哪些
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    bind-address=0.0.0.0
    下面配置可选项
    wsrep_cluster_name = ‘mycluster’ galera-cluster集群的名称默认my_wsrep_cluster
    wsrep_node_name = ‘node1’ 当前节点名称
    wsrep_node_address = ‘192.168.38.17’
  • 首次启动时,需要初始化集群,在其中一个节点上执行命令
    • /etc/init.d/mysql start --wsrep-new-cluster
  • 而后正常启动其它节点
    • service mysql start
  • 查看集群中相关系统变量和状态变量
    • SHOW VARIABLES LIKE ‘wsrep_%’;
    • SHOW STATUS LIKE ‘wsrep_%’;
    • SHOW STATUS LIKE ‘wsrep_cluster_size’;

Galera Cluster复制的问题和解决方案

1).数据损坏或丢失

  • Master: MHA + semi repl
  • Slave: 重新复制

2).混合使用存储引擎

  • MyISAM:不支持事务
  • InnoDB: 支持事务

3).不惟一的server id

  • 重新复制

4).复制延迟

  • 需要额外的监控工具的辅助
  • 一从多主:mariadb10版后支持
  • 多线程复制:对多个数据库复制

Galera Cluster实验

【1.实验规划】

  • wsrep_node_address1:192.168.38.17 wsrep_node_name = ‘node1’
  • wsrep_node_address2:192.168.38.27 wsrep_node_name = ‘node2’
  • wsrep_node_address3:192.168.38.37 wsrep_node_name = ‘node3’

【2.yum仓库配置并安装MariaDB-Galera-server】

# vim /etc/yum.repos.d/mysql.repo
[mysql]
name=mysql
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.65/yum/centos7-amd64/
gpgcheck=0

# yum install MariaDB-Galera-server -y

【3.节点配置】

# vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.38.17,192.168.38.27,192.168.38.37"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

wsrep_cluster_name = 'mycluster'
wsrep_node_name = 'node1'
wsrep_node_address = '192.168.38.17'

【4.服务启动】

  • 使用service启动
第一个节点(node1):
17 ~]# /etc/init.d/mysql start --wsrep-new-cluster

其后的节点:
# service mysql start

【5.实验测试】

利用xshell的撰写栏同时创建db1这个数据库:
    三个节点只有一个节点显示成功,解决了多主时数据不一致的问题。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值