zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

微服务架构实战:可扩展分布式数据库集群的搭建

2023-06-13 09:14:12 时间

可扩展分布式数据库集群的搭建

我们所设计的每个微服务应用都能适应高并发的调用,所以它所连接的数据库也必须具有这种特性,才能组成一个高性能的有机整体。不管是自己安装的数据库,还是使用云服务供应商提供的数据库,可扩展是前提条件。例如,MySQL、MongoDB和Redis都能够进行分布式的集群设计。下面介绍MySQL的集群设计和安装,希望读者能够举- -反三。

在MySQL的集群设计中,首先使用主从同步设计构建数据库集群,然后将这种集群以分组的形式通过主主同步实现高可用设计。而对数据库的访问,将使用OneProxy 数据库代理中间件实现读写分离设计。最后,对OneProxy的调用,还将使用LVS(LinuxVirtualServer,

Linux虚拟服务器)技术构建一个双机热备的访问机制。LVS将提供-一个虚拟的广播IP地址,即以VIP地址的形式对外提供服务。这个高可用的数据库集群的架构设计如图13-1所示。

其中,最主要的组成部分就是数据库的集群分组设计。这种集群分组可以根据应用平台的发展情况进行持续扩展。在安装和实施的过程中,我们将建立两个集群分组,每个分组都由一个主机和两个从机组成。

需要指出的是,不管数据库的集群由多少分组组成,这种读写分离的高可用架构设计对于一个微服务应用来说是完全透明的。微服务调用数据库的方式还是像以前一样配置-一个数据源进行访问,不同的是,只需将相应的连接地址改成这种高可用架构提供的VIP地址即可。

下面我们就从数据库的安装开始,按步骤讲解如何在分布式环境中实现高可用架构设计。

MySQL集群主机分配

我们使用六台主机创建两个MySQL集群分组,其中,集群分组1的服务器资源分配如表13-1所示。

集群分组2的服务器资源分配如表13-2所示。

这六台主机都必须安装MySQL。建议使用官方的yum安装源安装MySQL的最新稳定版。

yum安装源可以从MySQL的官方网站中下载。

主从同步设置

MySQL的主从同步设置是将主机设定为可读写服务器,将从机设定为只读服务器,从机的

数据是从主机中同步过来的。

下面以设置“10.10.10.35” (master) 与“10.10.10.36”(slave) 的主从同步为例进行说明。

1.主机设置

使用如下命令修改服务器名称:

vi /etc/hostname

将文件内容修改为“mysq1-35” 。

使用如下命令修改数据库服务器的配置:

vi /etc/my. cnf
在[mysqld]下面增加以下配置项: 
[mysqld]
#服务器的ID,必须唯一
server id=35
井复制过滤:不需要备份的数据库
binlog- ignore-db=mysql
#二进制日志名称
log-bin=demo-mysql-bin
#为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_ cache_ size=1M
#主从复制格式(mixed, statement,row, 默认格式是statement)
binlog_ format=mixed
#二进制日志自动删除/过期的天数。默认值为0,表示不自动删除
expire_ logs_ days=7
##跳过主从复制中遇到的所有错误或指定类型的错误,避免从机复制中断
##如1062错误是指一些主键重复,1032错误是指主从数据库数据不一致
slave_ skip_ errors=1032
#作为从机时的中继日志
relay_ 1og=demo-mysq1-relay-bin 
# log_ slave updates=1表示作为从机时也将复制事件写进自己的二进制日志中
log_ slave_ updates=1
#主键自增规则,避免主主同步导致ID重复
牛自增因子(每次加2 )
auto increment_ increment=2
#自增偏移(从1开始),单数
auto_ increment offset=1

设置完成后,保存配置,使用如下命令重启数据库服务器:

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;

结果如下所示:

1. 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 =
merchantuser/ 40739ED24B5DC118DC16397AB14E64C680637C0D@merchantdb
proxy-part-tables.1 = /usr/ local/oneproxy/conf/part1. txt
proxy-charset = utf8_ bin
proxy-group-policy.1 = groupl:read balance
proxy-group-policy.2 = group2: read balance
proxy-group-security.1 = group1:0
proxy-group-security.2 = group2:0
proxy-security-level = 0
proxy-sequence.1 = default
#监控端口
proxy-httpserver = :8080
#自动剔除节点
proxy-repl ication-check=1
proxy-httptitle = OneProxy Monitor

其中,只配置了订单服务的数据库“orderdb” 的访问用户orderuser, 和商家服务的数据库‘merchantdb" 的访问用户merchantuser, 其他数据库中的访问用户可以参照上面的方法增加进来。

在保存配置后,必须使用如下命令设定配置文件的读取权限:

chmod 660 conf/proxy. conf

然后,重启OneProxy,让前面的配置生效。

前面各项配置参数的含义如表13-3所示。

OneProxy还有一个管理后台,在OneProxy启动之后,可以通过MySQL客户端进行登录。管理后台的默认端口是4041,用户名为admin,密码为OneProxy。

例如,可以在安装了MySQL的机器上使用如下命令登录:

mysql -u admin -h 10.10.10.24 -P4041 -pOneProxy

登录管理后台之后,即可执行如表13-4 所示的一些命令。

注意:在使用斜体部分命令之前,需要了解命令对系统的含义,否则可能导致数据不一致或者系统不可用。

另外,还可以通过监控端口,在浏览器上查看各个数据库服务器的连接情况,使用如下所示的链接可以打开监控的控制台:

http://10.10.10.24:8080

其他有关OneProxy配置的详细说明还可以参考友哥(OneProxy 的开发者)的博客,读者可自行上网查找。

本文给大家讲解的内容是微服务架构实战:可扩展分布式数据库集群的搭建

  1. 下篇文章给大家讲解的是微服务架构实战:可扩展分布式数据库集群的搭建,OneProxy分库分区设计、双机热备设计;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。