前言:
如今看官们对“mysql集群搭建”大约比较看重,姐妹们都需要分析一些“mysql集群搭建”的相关资讯。那么小编在网上搜集了一些关于“mysql集群搭建””的相关文章,希望咱们能喜欢,各位老铁们快快来了解一下吧!这里分享一篇mysql集群部署方式,采用的是MariaDB多主方式(Multi-Master),适合用在高可用环境中。一般3个节点之上有一个高可用VIP(HAProxy + Keepalived),对开发者而言,只有一个数据库IP。3个节点挂掉一个,不会影响使用,运维及时恢复即可。那么我们先看看集群需要的菜谱:
三台服务器ubuntu14.04
192.168.3.1
192.168.3.2
192.168.3.3
MariaDB(10.1,因为10.1之后自带Gelera,无需单独安装)
Gelera(10.1之前版本需要单独安装)
rsync (集群互相学习使用的默认同步方式)
1. 软件安装
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] trusty main'
sudo apt-get update
sudo apt-get install rsync mariadb-server
安装软件后,首先把mysql服务停掉,完成配置后在启动。
2. 配置项
这里集群最少3台服务器,防止网络波动出现脑裂问题。3个服务器配置是相同的,如下:
vim /etc/mysql/my.cnf
# * Galera-related settings
#
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.3.1,192.168.3.2,192.168.3.3"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name="MariaDB_Cluster"
#
# Allow server to accept connections on all interfaces.
#
bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0
3. 启动集群
这里顺序比较重要,在其中一台服务器上执行语句:
service mysql start --wsrep-new-cluster
该语句是利用此节点创建一个集群节点,作为初始节点。其他两台服务器使用正常的启动就可以了,不需要使用其他参数:如下
service mysql start
如果遇到问题:ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)
因为集群中使用debian-sys-maint用户登录,而用户的密码是配置在debian.cnf中的,所有解决办法:
找到debian.cnf中的password,并修改成例如newxxx
使用语句重新设置debian-sys-maint的密码。语句见下面
重新启动集群。
set password for 'debian-sys-maint'@'localhost'=password('newxxx');
4. 验证集群
分别登录3个节点
mysql -uxxx -pxxxx
使用语句查看集群状态,wsrep_cluster_size = 3,其他参数注意观察,对后续运维很重要。
show status like 'wsrep_*';
5.集群说明(有看头)
虽然多个数据库节点实现了高可用,但这里带来一个架构问题,数据一致性问题,在并发较高,对事务要求比较严格的应用中会出现问题。
业务场景:
会员A在平台预定了一个产品,在9点整自动下单,此时会从会员中扣除费用。如果在扣费的过程中,A也充值了,很可能就会出现问题。
最根本的原因:事务没有锁住会员账户。这里牵扯到了两个事务,分别是扣费事务和充值事务。而这两个事务很可能不在同一个数据库节点上,例如扣费事务在01节点锁住账户,并更新余额。02节点没来得及学习,充值事务就来了,02节点也锁住了账户,完成了更新,并释放锁后学习了01的更新,导致02节点丢失了充值事务的操作。
有频繁更新且对事务要求比较严格的时候,就不要考虑使用这种方式,这种方式适合写多、并发更新少的场景。
Q:有办法避免事务不一致的问题吗?
A:改为读写分离的代码实现,完美解决上述问题。选择其中两个节点做VIP,另外一个做Master。注意使用sharding-jdbc,引入maven后数据源配置如下。
代码示例:
注意:同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库读取,用于保证数据一致性。所有使用这种方式,能满足绝大多数业务场景了。
感谢您的阅读,不足之处,还望指正。有疑问,可留言。
标签: #mysql集群搭建