微服务架构实战:可扩展分布式数据库集群的搭建
service mysqld restart
然后用 root 用户登录服务器,使用如下命令创建一个同步用户并授权:
mysql> grant replication slave, replication client on . to
'user36
'@'10.10.10.36' identified by 'user123456';
其中,user36 为用户名,user123456 为密码。
使用如下命令更新权限,让前面的设置立即生效:
mysq1> flush privileges;
使用如下命令查看主机状态:
mysql> show master status;
结果如下所示:
IFile
PositionI Binlog Do_ DB
Binlog_ Ignore_ DBI
Executed Gtid_ Set
demo-mysql-bin.000001 |
mysql
1 row in set (0.00 sec)
其中,File 为二进制日志文件名称,Position 为日志保存位置的偏移量。在后面的从机设置中将用到这两个参数。
2.从机设置
下面以“10.10.10.36"这台服务器的从机设置为例进行说明。
使用如下命令,修改服务器名称:
vi /etc/hostname
将内容修改为“mysql-36" 。
使用如下命令,修改数据库配置:
vi /etc/my.cnf
在[mysqld]下面增加以下配置项: .
[mysq1d]
server_ id=36
binlog- ignore-db=mysq1
log-bin=demo-mysql-bin
保存配置,重启数据库服务器。然后,用 root 用户登录数据库,使用如下所示的同步配置:
mysql>change master to master_ host='10.10.10.35',master user='user36',
master password=' user123456', master_ port=3306,
master log file='demo-mysql-bin. 000001', master_ log_ _pos=123,
master_ connect_ retry=30;
其中,通过 master_ log_ file 设置了主机的日志文件,通过 master_ log. pos 设置了主机的日志存储位置偏移量。这两个参数必须根据当前主机的状态进行配置。
使用如下命令启动从机,即可开始进行数据同步:
mysql>start slave;
使用如下命令查看从机的同步状态:
mysql>show slave status\G;
结果如下所示:
row
Slave_ IO_ State: Waiting for master to send event
Master_ Host: 10.10.10.35
Master User: user36
Master Port: 3306
Connect Retry: 30
Master_ Log_ File: demo-mysql -bin.000001
Read Master_ Log_ Pos: 123
Relay_ Log_ File: demo-mysq1 - relay-bin.000002
Relay_ Log_ Pos: 287
Relay Master_ Log_ File: demo-mysql-bin. 000001
Slave IO Running: Yes
Slave_ SQL Running: Yes
在上面的结果中,如果 Slave_ IO_ Running 和 Slave_ SQL_ _Running 都显示为“Yes" ,则表示同步成功。
服务器“10.10.10.37”的从机设置可以参照上面的方法实现。
主主同步设置
======
将两个集群分组的主机互相进行主从同步设置,就可以实现主主同步。
参照 13.2 节的方法,在集群分组 2 中实现主从同步设置。
其中,集群分组 2 的主机“10.10.10.25”的数据库配置与集群分组 1 的数据库配置相似,只是主键的配置为了避免冲突略有不同,即使用双数作为主键,代码如下所示:
[mysqld]
server id=25
binlog- ignore-db=mysql
log-bin=demo-mysql -bin
binlog_ cache_ size=1M
binlog_ format=mixed
expire_ logs_ days=7
slave_ skip errors=1032
relay_ log=demo-mysql-relay-bin
1og slave_ updates=1
auto increment increment=2
#自增偏移(从 2 开始),双数
auto increment offset=2
当集群分组 2 的主从设置完成之后,即可对两个分组的主机实现主主同步设置。首先实现集群分组 1 的主机“10.10.10.35”与集群分组 2 的主机“10.10.10.25”的主从设置。
1.集群分组 1 的主机配置
在“10.10.10.35”主机上创建同步用户并授权:
mysql> grant replication slave, replication client on . to
'user25'@'10. 10.10.25' identified by 'user123456';
更新权限:
mysql> flush privileges;
查看主机状态:
mysql> show master status;
记下查看结果中的日志文件名称和存储位置偏移量。
2.集群分组 2 的从机配置
使用如下所示的同步配置:
mysql>change master to master_ host=' 10.10.10.35 ,master user='user25',
master_ password= ' user123456',master_ port=3306,
master log_ file=' demo-mysql-bin.000001', master_ 1og_ pos=123,
master_ connect_ retry=30;
其中,日志文件名称和存储位置偏移量按上面主机查询的结果填写。
启动从机并进行同步:
mysql>start slave;
查看同步状态:
mysql>show slave status\G;
如果查询结果中包含如下所示的两行信息则表示同步设置成功:
Slave_ I0 Running: Yes
Slave_ SQL Running: Yes
上面配置完成之后,再反过来以“10.10.10.25”为主机,以“10.10.10.35”为从机,进行主从同步设置。具体可参照上面的方法实现。互为主从设置完成之后,就实现了主主同步设置。
为了对上面的同步设置进行验证,可以在各个主机上创建数据库,再执行一些插入或删除数据的操作,然后在各个从机中查看结果。如果各种操作都能同步,则说明主主同步和主从同步均设置成功。
如果出现同步失败的情况,则可以先停止失败的从机,视情况更改日志文件名称和偏移量,然后再启动从机继续进行同步。
停止从机可以使用如下命令:
mysql>stop slave;
需要说明的是,在生产环境中,推荐使用 UUID 作为数据库的主键,这样可避免主键冲突的情况发生,而且也便于在集群中创建更多的分组。
数据库代理中间件选择
===========
在实现了数据库集群之后,就已经解决了数据库的单机服务器的性能瓶颈问题,并且也建立了高可用的分布式架构,对于应用程序和数据库客户端,应该如何使用数据库才能更好地使用这种高可用、高性能的分布式集群系统呢?这就要借助于数据库代理中间件来实现了。
MySQL 的数据库代理中间件有很多,而且大多数是开源的,如 MyCat、Proxy、 Amoeba、OneProxy 等,其中比较优秀的是 MyCat 和 OneProxy。
MyCat 在大流量访问中有极佳的性能表现,它是用 Java 语言开发的,配置文件使用 XML 的形式,稍显复杂,特别是它的分区表的配置有点累赘。另外,一些用户对它的稳定性也颇有微词,所以这里推荐使用 OneProxy。
OneProxy 是一款基 于 MySQL 官方的 Proxy 中间件的设计思想开发的,运行稳定性好,配置也较为简单,分区表的概念与 MySQL 分区表的设置在根本.上是一致的。 虽然是一个收费的商业软件,但也提供了免费的社区版可供使用。
使用 OneProxy 实现读写分离设计
==================
OneProxy 可以非常方便地使用 MySQL 的集群体系架构,既可以按数据库的集群分组实现高可用设计,也可以按主从同步实现读写分离设计。使用两个集群分组的 OneProxy 调用设置的网络结构如图 13-2 所示。
安装 OneProxy
下面以安装“6.0.0”的版本为例进行说明,我们将 OneProxy 安装在 IP 地址为“10.10.10.24”的机器上。
下载安装包后,解压缩:
tar xf oneproxy-rhel5-linux64-v6.0.0-ga. tar.gz
将程序文件移到/usr/local/目录中:
mv oneproxy /usr/ local/oneproxy
切换到 oneproxy 目录:
cd /usr/ local/oneproxy
创建启动程序:
CP oneproxy .service /etc/ init.d/oneproxy
修改启动程序配置:
vi /etc/ init.d/oneproxy
将其中的工作目录修改成如下所示:
ONEPROXY_ HOME=/usr/loca1/ oneproxy
保存修改后,设置启动程序的执行权限:
chmod a+x /etc/init. d/oneproxy
使用如下命令启动 OneProxy:
service oneproxy start
使用如下命令设置开机启动 OneProxy:
chkconfig --add oneproxy
chkconfig oneproxy on
高可用读写分离配置
在使用 OneProxy 时,必须为每个数据库都创建--个具有完全权限的独立用户。在创建用户时,必须在数据库集群的主机中进行。
例如,对于订单服务数据库“orderdb”,可以使用如下命令创建用户并授权:
mysql> grant all privileges on orderdb.* to 'orderuser'@'8' identified by
'12345678' with grant option;
即创建一个具 有完全权限的用户,其用户名为 orderuser,密码为 12345678, 并设置在任何地方都可以访问,这里指在安全的局域网中。
需要注意的是,上面授权的用户 将保存在数据库 mysql 的 user 表中,虽然我们已经在主从设置中忽略了数据库 mysql 的同步,但是在创建用户时,并没有使用 use 指令切换过数据库,所以上面创建的用户还会在各个从机上进行同步。如果要禁止这种同步,则可以在主从设置中对主机的数据库配置增加一个忽略对 user 表进行同步的配置。这样操作之后,给数据库授权的命令就必须在每个服务器上都执行一遍。
在 OneProxy 服务器中,假设还在目录“ust/local/oneproxy”中,使用如下命令为密码生成加密字符串:
. /bin/mysqlpwd 12345678
执行后将生成如下所示的已经加密的密码字符串:
40739ED24B5DC118DC16397AB1 4E64C680637C0D
使用如下命令编辑 OneProxy 配置:
vi . / conf/porxy .conf
如下所示是使用两个集群分组的读写分离配置:
[oneproxy]
keepalive
event-threads = 4
log-file = 1og/oneproxy.1og
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck
mysql-version = 5.7.19
proxy-address = :3306
proxy-master-addresses.1 = 10. 10.10.35: 3306@group1
proxy-master-addresses.2 = 10.10. 10.25:3306@group2
proxy-slave-addresses.1 = 10.10.10. 36: 3306@group1
proxy-slave-addresses.2 = 10.10.10.37:3306@group1
proxy-slave-addresses.3 = 10.10.10.26:3306@group2
proxy-slave-addresses.4 = 10.10. 10.27:3306@group2
proxy-user-list.1 =
orderuser/40739ED24B5DC118DC1 6397AB14E64C680637C0D@orderdb
proxy-user-list.2 =
评论