MySQL 运维实战 集群

一 集群技术

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

类型:
M
M-S
M-S-S…
M-M
M-M-S-S

原理图示:
在这里插入图片描述

概念:

  1. 在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中。
  2. 备库I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中。
  3. 备库SQL线程读取中继日志中的事件,将其重放到备库数据库之上。

二 集群案例

1.环境;
环境三部曲
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服务器解析。

2.一主一从(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=‘master1’,
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)观察是否同步。

3.一主一从(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=‘master1’,
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)观察是否同步。

4.双主双从(MM-SS):

双主(MM):

前言
前面的实验,主服务器单节点设置。假如主服务器故障会影响全局的写入事件。
故设置双主。
目前:已经设置master1为master2的主服务器,
只需设置master2为master1的主服务器,
1 设置master2为master1的主服务器
在master2 上进行授权
mysql> grant replication slave, replication client on . to ‘rep’@‘192.168.2.%’ identified by ‘QianFeng@123’;
mysql> flush privileges;
master1
mysql> change master to
master_host=‘master2’,
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

三 代理技术

1.代理简介:

名词
DB Proxy,数据库中间件
功能
1. 读写分离 M-S-S M-M-S-S
2. 负载均衡 Galera Cluster
3. 支持数据的分片自动路由与聚合
产品
MySQL Proxy MySQL官方
Atlas 奇虎360
DBProxy 美团点评
Amoeba 早期阿里巴巴
cober 阿里巴巴
MyCat 阿里巴巴
图示
在这里插入图片描述
2.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.0.118’ 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值