开源数据库MySQL DBA运维实战 集群

tech2023-06-30  104

集群技术 集群概述 MySQL 复制技术 集群目的 负载均衡 解决高并发 高可用HA 服务可用性 远程灾备 数据有效性 图示

类型 M M-S M-S-S... M-M M-M-S-S 原理图示 图示1 图示2 概念 1. 在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中。 2. 备库I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中。 3. 备库SQL线程读取中继日志中的事件,将其重放到备库数据库之上。 集群案例 环境 环境三部曲 1.全新服务器-互相通信 2.全新安装mysql57-分别安装 3.配置域名解析 注意 请重新安装多台数据库,不要克隆已经安装的数据。因为数据库的ID相同。 master1 10.18.41.54 192.168.142.149 systemctl start mysqld master2 10.18.41.66 192.168.142.150 systemctl start mysqld slave 1 10.18.41.56 192.168.142.151 systemctl start mysqld slave 2 10.18.41.69 192.168.142.152 systemctl start mysqld 建议 可以使用host文件的形式,也可以使用DNS服务器解析。 一主一从(M-S)(1) 主(master1) 部署一台新mysql服务器。准备好域名解析。 准备数据1(验证主从同步使用) master1 create database master1db; create table master1db.master1tab(name char(50)); insert into master1db.master1tab values (1111); insert into master1db.master1tab values (2222); 开启二进制日志 master1 [root@localhost ~]# vim /etc/my.cnf log_bin server-id=1 [root@localhost ~]# systemctl restart mysqld 重启生效 创建复制用户 master1 grant replication slave, replication

client on . to ‘rep’@‘10.18.41.%’ identified by ‘QianFeng@123’; 备份master数据库的数据 master1 mysqldump -p’QianFeng@123’ --all-databases --single-transaction --master-data=2 --flush-logs > date +%F-mysql-all.sql scp -r 2020-1-1-mysql-all.sql master2:/tmp 发送给另一台主机 观察二进制日志分割点 CHANGE MASTER TO MASTER_LOG_FILE=‘localhost-bin.000002’, MASTER_LOG_POS=154; 准备数据2(验证主从同步使用) master1 insert into master1db.master1tab values (33333333); insert into master1db.master1tab values (44444); 从(master2) 测试rep用户是否可用 master2 部署数据库应用 mysql -h master1 -urep -p’QianFeng@123’ 预防账户问题。 启动服务器序号 [root@localhost ~]#vim /etc/my.cnf 不用在从设备上开启二进制日志,没有人向master2请求日志。 server-id=2 服务器ID是必须设置的。 [root@localhost ~]# systemctl restart mysqld mysql -uroot -p’QianFeng@123’ 测试服务器是否修改正确。能否正常登陆。 手动同步数据 mysql> set sql_log_bin=0; mysql> source /tmp/2020-1-1-mysql-full.sql 设置主服务器 mysql> change master to master_host=‘master’, master_user=‘rep’, master_password=‘QianFeng@123’, master_log_file=‘localhost-bin.000002’, master_log_pos=154; 注意,二进制日志的位置,应该参照主服务器备份时生成的新位置。 启动从设备 mysql> start slave; 查看启动状态(IO-YES/SQL-YES) show slave status\G; mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: master1 Master_User: rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: localhost-bin.000003 Read_Master_Log_Pos: 154 Relay_Log_File: localhost-relay-bin.000003 Relay_Log_Pos: 375 Relay_Master_Log_File: localhost-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes

返回主服务器(master1)更新数据,在从服务器(master2)观察是否同步。 一主一从(M-S)(2) 需求 实验2与上一个实验需求基本相同经。master1 作为主mysql,master2 作为从mysql。

不同之处,使用了 “gtid_mode=ON enforce_gtid_consistency=1” 该属性自动记录position位置。不需要手动指定了。 环境 因与实验1功能相同 请重置master2数据库 systemctl stop mysqld rm -rf /var/lib/mysql/* systemctl start mysqld grep password /var/log/mysqld.log mysqladmin -p’VsudOt+g%5Nw’ password ‘QianFeng@123’ 主 1 启动二进制日志,服务器ID,GTID vim /etc/my.cnf log_bin server-id=1 gtid_mode=ON enforce_gtid_consistency=1 systemctl restart mysqld 2 授权复制用户rep(略) grant replication slave,replication client on . to ‘rep’@‘192.168.122.%’ identified by ‘QianFeng@123’; flush privileges; 3 备份数据 mysqldump -p’QianFeng@123’ --all-databases --single-transaction --master-data=2 --flush-logs > date +%F-%H-mysql-all.sql master-data=2设置为2,已经不需要这个标记了。 scp 2020-1-1-mysql-all.sql master2:/tmp 4 模拟数据变化 insert into master1db.master1tab values (6666666666); 从 1 测试rep用户是否可用 master2 mysql -h master1 -urep -p’QianFeng@123’ 预防账户问题。 注意防火墙应该关闭 2 启动二进制日志,服务器ID,GTID vim /etc/my.cnf log_bin server-id=2 gtid_mode=ON enforce_gtid_consistency=1 systemctl restart mysqld 测试配置是否有问题,如果启动失败。请检查配置。 3 还恢复手动同步数据 set sql_log_bin=0; source /tmp/2020-1-1-mysql-full.sql select * from master1db.master1tab; 该实验的关键效果即将出现。 4 设置主服务器 mysql> change master to master_host=‘master’, master_user=‘rep’, master_password=‘QianFeng@123’, master_auto_position=1; 注意,和前一个实验比少了两行 mysql> change master to master_host=‘master1’, master_user=‘rep’, master_password=‘QianFeng@123’, master_log_file=‘localhost-bin.000002’, master_log_pos=154; start slave; show slave status\G; 5 返回主服务器(master1)更新数据,在从服务器(master2)观察是否同步。 双主双从(MM-SS) 双主(MM) 前言 前面的实验,主服务器单节点设置。假如主服务器故障会影响全局的写入事件。 故设置双主。 目前:已经设置master1为master2的主服务器, 只需设置master2为master1的主服务器, 1 设置master2为master1的主服务器 在master2 上进行授权 mysql> grant replication slave, replication client on . to ‘rep’@‘192.168.87.%’ identified by ‘QianFeng@123’; mysql> flush privileges; master1 mysql> change master to master_host=‘slave’, master_user=‘rep’, master_password=‘QianFeng@123’, master_auto_position=1; start slave; show slave status\G; 如果状态不佳,重启一下master2的mysqld 再去master2上。启动和停止从属状态。 start slave; stop slave; 测试 master1上插入数据,在master2上观察 master2上插入数据,在master1上观察 双方同步成功,双主设置完成。 双从(SS) 1 同步现有数据库 master1 mysqldump -p’QianFeng@123’ --all-databases --single-transaction --master-data=2 --flush-logs > date +%F-mysql-all.sql scp -r 2020-1-1-mysql-all.sql slave1:/tmp scp -r 2020-1-1-mysql-all.sql slave2:/tmp slave1 # mysql -p’QianFeng@123’ < /tmp/2020-1-1-mysql-all.sql slave2 mysql -p’QianFeng@123’ < /tmp/2020-1-1-mysql-all.sql 2 启动从服务器ID,gtid slave1 vim /etc/my.cnf server-id=3 gtid_mode=ON enforce_gtid_consistency=1 master-info-repository=TABLE relay-log-info-repository=TABLE 从机把主的信息存在主信息仓库里。主信息库可以是文件也可以上表,具体由—master-info-repository参数值决定。—master-info-repository=file时 会生成master.info 和 relay-log.info2个文件,如果—master-info-repository=table,信息就会存在mysql.master_slave_info表中。 systemctl restart mysqld slave2 vim /etc/my.cnf server-id=4 gtid_mode=ON enforce_gtid_consistency=1 master-info-repository=TABLE relay-log-info-repository=TABLE systemctl restart mysqld 3 设置主服务器 slave1 mysql> change master to master_host=‘master1’, master_user=‘rep’, master_password=‘QianFeng@123’, master_auto_position=1 for channel ‘master1’; mysql> change master to master_host=‘master2’, master_user=‘rep’, master_password=‘QianFeng@123’, master_auto_position=1 for channel ‘master2’; start slave; show slave status\G; slave2 mysql> change master to master_host=‘master1’, master_user=‘rep’, master_password=‘QianFeng@123’, master_auto_position=1 for channel ‘master1’; mysql> change master to master_host=‘master2’, master_user=‘rep’, master_password=‘QianFeng@123’, master_auto_position=1 for channel ‘master2’; start slave; show slave status\G 4 测试 master1 插入数据 master2插入数据 slave1查看 slave2查看 错误示例 mysql数据库错误代码解决.docx 代理技术 代理简介 名词 DB Proxy,数据库中间件 功能 1. 读写分离 M-S-S M-M-S-S 2. 负载均衡 Galera Cluster 3. 支持数据的分片自动路由与聚合 产品 MySQL Proxy MySQL官方 Atlas 奇虎360 DBProxy 美团点评 Amoeba 早期阿里巴巴 cober 阿里巴巴 MyCat 阿里巴巴 图示

Mycat 实战 架构 请准备好域名解析 MyCat 10.18.43.163 mycat M-M-S-S 10.18.43.41 master1 10.18.43.170 master2 192.168.0.116 slave1 192.168.0.117 slave2 案例1 一、配置 Java环境 下载jdk图示 tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/ 解压java软件开发工具包 ln -s /usr/local/jdk1.8.0_91/ /usr/local/java tail -3 /etc/profile JAVA_HOME=/usr/local/java

PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH export JAVA_HOME PATH 添加三行 设置JAVA变量,便于JAVA调用 source /etc/profile env |grep JAVA java -version 查询到版本。说明jdk安装成功 二、配置Mycat 下载mycat http://www.mycat.org.cn/

wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 百度云盘有安装包 tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/ ls /usr/local/mycat/ 配置mycat前端 vim /usr/local/mycat/conf/server.xml 注释掉多余用户 95行-99行 启动mycat管理员 配置mycat后端 请备份该文件 vim /usr/local/mycat/conf/schema.xml 注释 schema name:mycat维护的集群名称。

datanode:后方节点群的名称。 datahost:后方节点群的主机名称。 writehost:写主机 readhost:读主机 倒着看。 在本例中switchType值设置为1,表示自动切换,某些对主从数据一致要求较高的场景,建议使用2判断主从状态后再切换 切换的触发条件为主节点mysql服务崩溃或停止 slaveThreshold 主从的延迟在多少秒以内,则把读请求分发到这个从节点,否则不往这个节点分发,假设生产环境能容忍的主从延时为60秒,则设置此值为60,此例中设置值为100

关于属性的介绍 balance 类型 1. balance=“0”, 关闭读写分离功能。 所有读操作都发送到当前可用的writeHost上。 2. balance=“1”,开启读写分离 所有读操作都随机的发送到readHost。 writeType 属性 备份型 1. writeType="0", 所有写操作发送到配置的第一个 writeHost,

第一个挂了切到还生存的第二个writeHost, 重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties . 负载型 2. writeType=“1”,所有写操作都随机的发送到配置的 writeHost。 switchType 模式 switchType指的是切换的模式,目前的取值也有4种: 1. switchType=’-1’ 负1表示不自动切换 2. switchType=‘1’ 默认值,表示根据延时自动切换 3. switchType=‘2’ 根据MySQL主从同步的状态决定是否切换,心跳语句为 show slave status 三、配置mysql群 M-M-S-S 准备Mycat连接的用户及权限 例如master1 grant all on . to ‘mycatproxy’@‘192.168.87.130’ identified by ‘QianFeng@123’; 192.168.0.118是mycat服务器的IP 四、启动Mycat 在mycat服务器上 /usr/local/mycat/bin/mycat start Starting Mycat-server… 启动成功,否则就是配置Mycat后端语法错误。 netstat -anpt | grep java 监测端口是否启动 [root@localhost ~]# netstat -anpt | grep java tcp 0 0 127.0.0.1:32000 0.0.0.0:* LISTEN 3487/java tcp6 0 0 :::1984 ::😗 LISTEN 3487/java tcp6 0 0 :::8066 ::😗 LISTEN 3487/java tcp6 0 0 :::59268 ::😗 LISTEN 3487/java tcp6 0 0 :::9066 ::😗 LISTEN 3487/java tcp6 0 0 :::44500 ::😗 LISTEN 3487/java tcp6 0 0 127.0.0.1:31000 127.0.0.1:32000 ESTABLISHED 3487/java ps aux | grep mycat 检测进程是否启动 [root@localhost ~]# ps aux | grep mycat root 3485 0.0 0.1 17812 808 ? Sl 23:36 0:00 /usr/local/mycat/bin/./wrapper-linux-x86-64 /usr/local/mycat/conf/wrapper.conf wrapper.syslog.ident=mycat wrapper.pidfile=/usr/local/mycat/logs/mycat.pid wrapper.daemonize=TRUE wrapper.lockfile=/var/lock/subsys/mycat root 3487 4.0 35.4 6473184 172568 ? Sl 23:36 0:03 java -DMYCAT_HOME=. -server -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx4G -Xms1G -Djava.library.path=lib -classpath lib/wrapper.jar:conf:lib/zookeeper-3.4.6.jar:lib/jline-0.9.94.jar:lib/ehcache-core-2.6.11.jar:lib/log4j-1.2.17.jar:lib/fastjson-1.2.12.jar:lib/curator-client-2.11.0.jar:lib/joda-time-2.9.3.jar:lib/log4j-slf4j-impl-2.5.jar:lib/libwrapper-linux-x86-32.so:lib/netty-3.7.0.Final.jar:lib/druid-1.0.26.jar:lib/log4j-api-2.5.jar:lib/mapdb-1.0.7.jar:lib/slf4j-api-1.6.1.jar:lib/univocity-parsers-2.2.1.jar:lib/hamcrest-core-1.3.jar:lib/Mycat-server-1.6-RELEASE.jar:lib/objenesis-1.2.jar:lib/leveldb-api-0.7.jar:lib/hamcrest-library-1.3.jar:lib/wrapper.jar:lib/commons-lang-2.6.jar:lib/reflectasm-1.03.jar:lib/mongo-java-driver-2.11.4.jar:lib/guava-19.0.jar:lib/curator-recipes-2.11.0.jar:lib/curator-framework-2.11.0.jar:lib/libwrapper-linux-ppc-64.so:lib/log4j-core-2.5.jar:lib/leveldb-0.7.jar:lib/sequoiadb-driver-1.12.jar:lib/mysql-binlog-connector-java-0.4.1.jar:lib/kryo-2.10.jar:lib/jsr305-2.0.3.jar:lib/commons-collections-3.2.1.jar:lib/disruptor-3.3.4.jar:lib/log4j-1.2-api-2.5.jar:lib/velocity-1.7.jar:lib/libwrapper-linux-x86-64.so:lib/dom4j-1.6.1.jar:lib/minlog-1.2.jar:lib/asm-4.0.jar -Dwrapper.key=cECV31vA3vcZHrvr -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=3485 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp io.mycat.MycatStartup start

yum install -y mariadb 安装客户端 mysql -hmycat -uroot -p123456 -P8066 show databases; MySQL [(none)]> show databases;

±---------+ | DATABASE | ±---------+ | tianyun | ±---------+ 1 row in set (0.01 sec)

看到的数据库是虚拟的。 注意后方mysql群中应该创建该库 在mysql-master1上创库创表 create database tianyun; create table tianyun.t1 (id int); 五、Mycat使用后方数据库 在mycat上 select * from tianyun.t1; insert into tianyun.t1 values(3); 在mysql集群能 查询到数据。实验完成。 案例2 多库时如何设置mycat
最新回复(0)