主从备份
高可用架构
主从备份 是常见的场景一主一从/(多从)
工作
而不会数据丢失…mysql主节点(称master) | 从(称slave)复制
首先我们要先开启主机的 日志记录
master主机,每进行 DML的操作,向日志中写入一条消息记录 到二进制日志事件(binary log)
从节点,中会指定主节点的信息:ip 端口 二进制日志 的位置文件...
并启动一个线程,异步实时的
将master的binary log events拷贝到它的中继日志(relay log)
slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)
注意:
服务id
都必须唯一这里本人直接使用提供好的tar 进行生成Docker镜像
正常情况其实也无疑..
#本人安装软件的目录:
[root@hadoop1 ~]# cd /usr/local
[root@hadoop1 local]# ls
apache-phoenix-5.0.0-HBase-2.0-bin elasticsearch haproxy-1-9-3.tar kafka_2.10-0.10.2.1 MR-1.0-SNAPSHOT.jar partition.csv zookeeper-3.4.13
apache-tomcat-7.0.85 elasticsearch-6.2.4 hbase-2.1.0 kibana-6.2.4-linux-x86_64 Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz percona-5-7-23.tar
apollo hadoop jdk1.8.0_171 logstash-6.3.0 mysql wordcount.txt
#本人没有下载,就直接讲 tar包转换成镜像文件了...
[root@hadoop1 local]# docker load --input percona-5-7-23.tar
f972d139738d: Loading layer [==================================================>] 208.8MB/208.8MB
793d15bf88da: Loading layer [==================================================>] 6.144kB/6.144kB
f34bc9e37309: Loading layer [==================================================>] 303.1kB/303.1kB
39df7a5abc61: Loading layer [==================================================>] 22.46MB/22.46MB
#省略..
#查看所有镜像
#percona Mysql衍生版本
#haproxy 代理服务器
[root@hadoop1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
haproxy 1.9.3 d1ba0f09266d 2 years ago 72.1MB
percona 5.7.23 9db94bcf28b3 2 years ago 577MB
正片开始
Mysql master主节点搭建
#回到根目录 创建文件目录(用户区分之前安装的应用...)
[root@hadoop1 /]# cd /
[root@hadoop1 /]# mkdir -p /data/mysql/master01
#进入一号主节点目录
[root@hadoop1 /]# cd /data/mysql/master01
#创建两个目录:conf配置文件 data日志文件,为了方便操作容器内,创建数据卷
[root@hadoop1 master01]# mkdir conf data
[root@hadoop1 master01]# ls
conf data
#linux 设置文件权限 777 最大!
[root@hadoop1 master01]# chmod 777 * -R
[root@hadoop1 master01]# cd /data/mysql/master01/conf
#创建编写配置文件
[root@hadoop1 conf]# vim my.cnf
#生成容器
#-v 设置数据卷:容器与宿主机进行文件管理共享,为了方便更改查看配置文件!
#-p 设置端口,因为对外访问的是linux的端口,容器内部的端口要与宿主机进行映射所以之后的 3306只能有一个!(后面就是3307 3316别搞混)
#-e 配置数据库默认密码 root
[root@hadoop1 conf]# docker create --name percona-master01 -v /data/mysql/master01/data:/var/lib/mysql -v /data/mysql/master01/conf:/etc/my.cnf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
cde032cb98a0465f08cee6554e83a4d53ce2b72bc95f662746d712418d4d1c91
#启动mysql 容器 && (并且查看他的启动日志:如果启动报错就可以实时的发现!
[root@hadoop1 conf]# docker start percona-master01 && docker logs -f percona-master01
#...
[root@hadoop1 ~]# docker ps -a
cde032cb98a0 percona:5.7.23 "/docker-entrypoint.…" 15 hours ago Exited (255) 15 minutes ago 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp percona-master01
my.cnf 文件内容
#配置mysql基础信息
[mysqld]
#开启二进制日志,集群必须开启,主从互备直接通信就是通过: 二进制日志! (从节点这个可以忽略!)
log-bin=mysql-bin
#服务id,同一个集群环境下服务id不可重复!
server-id=1
log-bin=mysql-bin
二进制日志
即可!文件名
文件位置...
设置:主节点配置信息
#创建同步账户以及授权
CREATE USER 'wf'@'%' IDENTIFIED BY 'wf';
#配置权限, 读库读表的操作 *.*
GRANT REPLICATION SLAVE ON *.* TO 'wf'@'%';
#刷新MySQL的系统权限相关表
FLUSH PRIVILEGES;
#查看master状态
SHOW MASTER STATUS;
#查看二进制日志相关的配置项
SHOW GLOBAL VARIABLES LIKE 'binlog%';
#查看server相关的配置项
SHOW GLOBAL VARIABLES LIKE 'server%';
注意:
解决方案,在my.cnf配置文件中设置
##创建目录,创建数据卷,编写my.cnf
[root@hadoop1 mysql]# mkdir -p /data/mysql/slave01
[root@hadoop1 slave01]# cd /data/mysql/slave01
[root@hadoop1 slave01]# mkdir conf data
[root@hadoop1 slave01]# chmod 777 * -R
[root@hadoop1 slave01]# cd /data/mysql/slave01/conf
[root@hadoop1 conf]# vi my.cnf
#创建容器
[root@hadoop1 conf]# docker create --name percona-slave01 -v /data/mysql/slave01/data:/var/lib/mysql -v /data/mysql/slave01/conf:/etc/my.cnf.d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
3ac806767c09ce3adb6c468f45f61020afeef701cd0162e439dcae01a040338a
#启动容器
[root@hadoop1 conf]# docker start percona-slave01 && docker logs -f percona-slave01
percona-slave01
my.cnf
文件 不需要配置,log-bin=mysql-bin
开启二进制日志!
#设置master相关信息
CHANGE MASTER TO
MASTER_HOST='192.168.1.110', #注意端口
MASTER_USER='wf',
MASTER_PASSWORD='wf',
MASTER_PORT=3316, #主节点的端口
MASTER_LOG_FILE='mysql-bin.000004', #指定要监听主节点的 二级制日志文件;
MASTER_LOG_POS=154; #二级制文件位置
#启动同步
START SLAVE;
#查看master状态
SHOW SLAVE STATUS; #(Waiting for master to send event):等待主服务器发送事件
#错误:
#ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAV
-- mysql从机上已经进行过绑定主机,如果继续绑定需要先进行重置。
#停止已经启动的绑定
STOP SLAVE
#重置绑定
RESET MASTER
库/表
新增数据…在查看从机上是否同步...
安装两个数据库
一个当Master 一个当Slave日志记录
从机实时开启一个线程读取主机的执行SQL 同步执行数据…原理
我们一般应用对数据库而言都是 “读多写少” 也就说对数据库读取数据的压力比较大
解决方案:
采用数据库集群的方案:
其中一个是主库,负责写入数据,我们称之为:写库;
其它都是从库,负责读取数据,我们称之为: 读库; 一主n从 主从互备 读写分离架构!
那么,对我们的要求是: 1. 读库和写库的数据一致
2. 写数据必须写到写库
3. 读数据必须到读库
图:
数据库从之前的单节点变为多节点提供服务
主节点数据,同步到从节点数据
应用程序需要连接到2个数据库节点,并且在程序内部实现判断读写操作
这种架构存在2个问题:
应用程序需要连接到多个节点,对应用程序而言开发变得复杂 可以通过中间件解决
如果在程序内部实现,可使用Spring的AOP功能实现
图:
中间件解决: 读写分离
应用程序只需要连接到中间件即可,无需连接多个数据库节点
应用程序无需区分读写操作
,对中间件直接进行读写操作即可
在中间件中进行区分读写操作,读发送到从节点,写发送到主节点 一切交给中间件操作,无需关心数据库
Windwos / Linux
基本解压即用。 需要了解注意的是它的
配置文件#查看本人的软件目录
[root@hadoop1 ~]# cd /usr/local
[root@hadoop1 local]# ls
apache-phoenix-5.0.0-HBase-2.0-bin elasticsearch haproxy-1-9-3.tar kafka_2.10-0.10.2.1 MR-1.0-SNAPSHOT.jar Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz percona-5-7-23.tar
apache-tomcat-7.0.85 elasticsearch-6.2.4 hbase-2.1.0 kibana-6.2.4-linux-x86_64 mycat mysql wordcount.txt
apollo hadoop jdk1.8.0_171 logstash-6.3.0 mycat2 partition.csv zookeeper-3.4.13
#Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz 压缩包..
#Mycat Mycat2(后面准备搭建集群)
#启动Mycat
[root@hadoop1 local]# cd /usr/local/mycat
[root@hadoop1 mycat]# cd bin
[root@hadoop1 bin]# ls
dataMigrate.sh init_zk_data.sh mycat rehash.sh startup_nowrap.sh wrapper-linux-ppc-64 wrapper-linux-x86-32 wrapper-linux-x86-64
#Mycat命令 ./mycat { console | start启动 | stop停止 | restart | status运行状态 | dump }
[root@hadoop1 bin]# ./mycat start
Starting Mycat-server...
#查看服务进程是否启动
[root@hadoop1 bin]# jps
2721 WrapperSimpleApp
2742 Jps
tar -zxvf 要解压的文件
注意:
<tableRule name="mod-long">
<rule>
<columns>idcolumns>
<algorithm>mod-longalgorithm>
rule>
tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">1property>
function>
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="wf" checkSQLschema="false" sqlMaxLimit="100">
<table name="wsm" dataNode="dn1" rule="mod-long" />
schema>
<dataNode name="dn1" dataHost="cluster1" database="wsm" />
<dataHost name="cluster1" maxCon="1000" minCon="10" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="W1" url="192.168.1.110:3306" user="root" password="root">
<readHost host="W1R1" url="192.168.1.110:3307" user="root" password="root" />
writeHost>
dataHost>
mycat:schema>
数据库分片的内容
表名要与数据库匹配
——数据节点database指定对应的
数据库
——数据库 主机配置详情参考上面连接学习!
连接的逻辑表
<user name="wf" defaultAccount="true">
<property name="password">wfproperty>
<property name="schemas">wfproperty>
user>
多个
数据分片:什么是数据库分片
三种分片模式: 垂直切分
水平切分
混合切分
集群:
重复操作…不详细解释了
注意
更改端口,容器名!#创建目录
mkdir -p /data/mysql/master02
cd /data/mysql/master02
cd /data/mysql/master02
chmod 777 * -R
#创建配置文件
cd /data/mysql/master02/conf
vim my.cnf
#创建容器
docker create --name percona-master02 -v /data/mysql/master02/data:/var/lib/mysql -v /data/mysql/master02/conf:/etc/my.cnf.d -p 3316:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
#启动
docker start percona-master02 && docker logs -f percona-master02
my.cnf
设置用户,分片权限
mkdir /data/mysql/slave02
cd /data/mysql/slave02
mkdir conf data
chmod 777 * -R
#创建配置文件
cd /data/mysql/slave02/conf
vim my.cnf
#创建容器
docker create --name percona-slave02 -v /data/mysql/slave02/data:/var/lib/mysql -v /data/mysql/slave02/conf:/etc/my.cnf.d -p 3317:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
#启动
docker start percona-slave02 && docker logs -f percona-slave02
别忘了
查看所有运行的容器:
[root@hadoop1 bin]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a2f509b44da7 percona:5.7.23 "/docker-entrypoint.…" 18 hours ago Up 15 seconds 0.0.0.0:3317->3306/tcp, :::3317->3306/tcp percona-slave02
1d03a6315278 percona:5.7.23 "/docker-entrypoint.…" 18 hours ago Up 4 minutes 0.0.0.0:3316->3306/tcp, :::3316->3306/tcp percona-master02
3ac806767c09 percona:5.7.23 "/docker-entrypoint.…" 21 hours ago Up About an hour 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp percona-slave01
cde032cb98a0 percona:5.7.23 "/docker-entrypoint.…" 21 hours ago Up About an hour 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp percona-master01
汇总
中间件
集群:因为同一个ip 下端口要不同
更改一下端口配置即可:[root@hadoop1 local]# ls
apache-phoenix-5.0.0-HBase-2.0-bin elasticsearch haproxy-1-9-3.tar kafka_2.10-0.10.2.1 MR-1.0-SNAPSHOT.jar Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz percona-5-7-23.tar
apache-tomcat-7.0.85 elasticsearch-6.2.4 hbase-2.1.0 kibana-6.2.4-linux-x86_64 mycat mysql wordcount.txt
apollo hadoop jdk1.8.0_171 logstash-6.3.0 mycat2 partition.csv zookeeper-3.4.13
[root@hadoop1 local]#
搭建多节点mycat: 直接copy 一个更改配置!
cp mycat mycat2 -R
vim wrapper.conf
#设置jmx端口
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1982(默认) 1985(修改)
vim server.xml
#设置服务端口以及管理端口
<property name="serverPort">8066/ 8067</property>
<property name="managerPort">9066 / 9067</property>
#重新启动服务
#拉取镜像
docker pull haproxy:1.9.3
#创建数据卷 创建容器...
[root@hadoop1 bin]# mkdir -p /haoke/haproxy
[root@hadoop1 bin]# docker create --name haproxy --net host -v /haoke/haproxy:/usr/local/etc/haproxy haproxy:1.9.3
b6ab17da4aaa0ef43a4a5253ab23b46366db9873e0b03a307291f0086613c820
#编辑配置文件
[root@hadoop1 bin]# vim /haoke/haproxy/haproxy.cfg
#启动容器...打印日志
[root@hadoop1 bin]# docker restart haproxy && docker logs -f haproxy
haproxy
[WARNING] 109/153326 (1) : config : 'option forwardfor' ignored for proxy 'proxy-mysql' as it requires HTTP mode.
[NOTICE] 109/153326 (1) : New worker #1 (7) forked
[WARNING] 109/153328 (7) : Server proxy-mysql/mycat_1 is DOWN, reason: Layer4 timeout, check duration: 2000ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[WARNING] 109/153329 (7) : Server proxy-mysql/mycat_2 is DOWN, reason: Layer4 timeout, check duration: 2023ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[ALERT] 109/153329 (7) : proxy 'proxy-mysql' has no server available!
#查看运行容器 运行成功!
[root@hadoop1 bin]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6ab17da4aaa haproxy:1.9.3 "/docker-entrypoint.…" 2 minutes ago Up 17 seconds haproxy
a2f509b44da7 percona:5.7.23 "/docker-entrypoint.…" 39 minutes ago Up 39 minutes 0.0.0.0:3317->3306/tcp, :::3317->3306/tcp percona-slave02
vim /haoke/haproxy/haproxy.cfg
#创建文件本人目前只是应用就不一一解释:
vim /haoke/haproxy/haproxy.cfg
#日志管理
# maxconn 最大连接数4000
global
log 127.0.0.1 local2
maxconn 4000
daemon
#支持http …
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#自带的一套ur 管理页面监听web模式4001.. 账户密码
listen admin_stats
bind 0.0.0.0:4001
mode http
stats uri /dbs
stats realm Global\ statistics
stats auth admin:admin123
#监听服务 4002 指定监听mycat配置,监听地址
#balance roundrobin 轮询模式.. server 两个mycat服务
listen proxy-mysql
bind 0.0.0.0:4002
mode tcp
balance roundrobin
option tcplog
server mycat_1 192.168.1.110:8066 check port 8066 maxconn 2000
server mycat_2 192.168.1.110:8067 check port 8067 maxconn 2000
建议删除中文...
但就,出现了多个ip
有人说 haproxy挂了怎么办?