前序
![a4cd93718502cc9cd9013fbe0eda0335.png](https://i-blog.csdnimg.cn/blog_migrate/ea77ed11b6acdd060e63a7eb15434bdb.jpeg)
图1 MariaDB读写分离集群
大家好,今天我们讨论MariaDB数据库服务器的群集案例,今天给大家带来一份经典案例,通过mycat实现读写分离,有效解决数据库高并发性问题。我们知道,数据库服务器作为“后端”服务,是数据处理重要的设备,为了保证数据库服务器稳定高效的运行,将数据库的两个基本操作,“读”和“写”功能进行分离,在大型的数据库群集环境下,一些数据库专门处理用户的“写”操作(例如insert、update、delete),另外一些数据库专门处理“读”操作(例如select)。这样做,可以有效减轻数据库服务器的负担,提高数据库服务器的响应速率。读写分离的一个难点是如何实现数据库的同步,因为不管是读操作还是写操作,最终,群集中的所有数据库服务器的内容要保持一致。我将带领大家在模拟环境下完成数据库的读写分离操作。
实验过程
![96e3cf9c1286ebef5808f586940701ad.png](https://i-blog.csdnimg.cn/blog_migrate/7821dfca8daa9fceb54d6cbc98c424b9.jpeg)
图2 读写分离模拟环境
实验准备、3台CentOS7服务器(vmware workstation)图2所示
- db1:读数据库 192.168.0.1
- db2:写数据库 192.168.0.2
- mycat:读写分离设备 192.168.0.3
注:实验开始前,为了保证实验顺利进行,请关闭三台设备的防火墙(systemctl stop firewalld)和selinux(setenforce 0)。
步骤一、设置三台主机的IP地址、主机名和静态解析
![fd5b22f3132a53ce7b3ce6fc0d78198c.png](https://i-blog.csdnimg.cn/blog_migrate/39b396debb8e4a66da1f48468306b4f4.jpeg)
图3 db1主机名和IP信息
![1e6e4a1c9a195af5e260ccb15221fc93.png](https://i-blog.csdnimg.cn/blog_migrate/79e799637b76b7f671e6a3a439faafb0.jpeg)
图4 db2主机名和IP信息
![e55bf34c26041f5543d519de1821a2a3.png](https://i-blog.csdnimg.cn/blog_migrate/2a13ba5d9711ec34211bdab639958f04.jpeg)
图5 mycat主机名和IP信息
图3、图4、图5,设置主机名和IP地址
![f2fa70781f2208a681e41d0ea16adafa.png](https://i-blog.csdnimg.cn/blog_migrate/143a8311936fd9cafaf5d4c0a684d048.jpeg)
图6 配置静态解析
图6、为了使实验效果容易看懂,特别用了静态解析,分别定义了db1、db2、mycat三台主机,因为是实验环境,所以仅配置了静态解析,要在三台设备上都设置,真实环境下,一台DNS服务器就搞定了,这里不再赘述关于DNS服务器的配置,DNS服务器还不会搭建的读者可以参考我的视频:DNS服务器搭建。
步骤二、配置YUM安装源
![75a8a83afc42c54597c4010e2aea6c8d.png](https://i-blog.csdnimg.cn/blog_migrate/cdef7d6a932ed94d57e1a09271047bf0.jpeg)
图7 上传yum包
图7中,由于CentOS7自带的mariadb版本太低了,我自己做了一个yum源,包含mariadb10版本,将自制的yum包上传到/root目录下,三台主机都要上传,这里只演示了192.168.0.3,另外两台主机方法相同,省略。
![fc34ddf59b8b2bb3b99a3689c380156a.png](https://i-blog.csdnimg.cn/blog_migrate/7cec10b59004fcc54807391caced8c4f.jpeg)
图8 local.repo
图8,清空/etc/yum.repos.d/目录下所有文件,新建local.repo,写入两个源,一个是CentOS7安装光盘,一个是我自己上传的源pip.cc.repo。为什么要定义两个源?因为我自己做的源只包含了mariadb10,该案例还需要安装其它软件,所以安装光盘源还是需要的。
![ff188ebae43b7a9922ae0d38cd84f009.png](https://i-blog.csdnimg.cn/blog_migrate/e76ef605ba48db58b6e294566e945e69.jpeg)
图9 拷贝local.repo
图9,三台设备YUM源配置是一样的,这里我偷个懒,直接通过scp命令将设置好的local.repo文件传到另外两台主机上,省的重复写了。
![12c9115e48d1d54b6ebe20df5ae2bf06.png](https://i-blog.csdnimg.cn/blog_migrate/d41b23c528acf06bb70279e197a11107.jpeg)
图10 验证YUM源
图10,配置好YUM源后要验证一下,如果没有报错,就好了,注意三台主机上都要验证。
步骤三、安装MariaDB,并设置root密码
![d53eacff9e32457514f18c688e0a0916.png](https://i-blog.csdnimg.cn/blog_migrate/79a84d94ad9dd11f9358a4cb926c8ebb.jpeg)
图11 安装MariaDB
图11,分别在db1和db2上安装MariaDB服务器,记住服务端要装,客户端也要安装,因为还要调试配置。
![6fdb8bb55ef406d9e39f53e3f071ad51.png](https://i-blog.csdnimg.cn/blog_migrate/82eb7f13a48e84e9b5fe040b7d918dbc.jpeg)
图12 设置root密码
图12,MariaDB的root密码设置为123456,图中演示的db1,db2设置相同
![2eca10d693d636a3c946603034afa061.png](https://i-blog.csdnimg.cn/blog_migrate/ad48f8d94c8f990e9855ce769a81a339.jpeg)
图13 设置root登录权限
图13,这里要注意,root要允许远程登录,即表示在其它主机上可以通过root用户登录,因为一会要用mycat远程连接db1或db2。途中演示的db1,db2设置相同。
步骤四、配置主、备分离,实现数据库同步
![ad9357585c41a30b77ea613e9f68b6ee.png](https://i-blog.csdnimg.cn/blog_migrate/b59d917b0881bb268ca83a22ca68c354.jpeg)
图14 server.cnf
图14,要实现读写分离,首先要实现数据库同步,通过主备分离法实现,修改server.cnf配置文件,注意主服务器server_id=1,备服务器server_id=2,其它设置一样,图12只演示了主服务器,备服务器略,配置好后记得重启mariadb服务。
![f19b2b728d9867a2e84222b3f828be6d.png](https://i-blog.csdnimg.cn/blog_migrate/b586900be7c964413fe4a57843e56104.jpeg)
图15 主服务器配置
![77baa66fb2a98924828a165a83fbcf1e.png](https://i-blog.csdnimg.cn/blog_migrate/14edaf0f280d1bdb3b5e0a2265a7a305.jpeg)
图16 备份服务器配置
![df10521ec24358fcb5c193e0a82d977c.png](https://i-blog.csdnimg.cn/blog_migrate/717c48533720f6836b65f1a331e29281.jpeg)
图17 在备份服务器上验证,没报错即代表成功
图13、图14、图15是主备服务器的配置过程,在“主-从”MySQL数据库服务器实现高并发性集群配置中有详细介绍,这里不再赘述。
步骤五、配置mycat,实现数据库读写分离,主服务器作为写服务器,备份服务器作为读服务器
![a8e5ea4833ede0396093632a8dccd4e6.png](https://i-blog.csdnimg.cn/blog_migrate/070ec427651efedd2aac9a72a4aaebdd.jpeg)
图18 安装java环境
![c7c3122831f2872fef6b06aa882eaf99.png](https://i-blog.csdnimg.cn/blog_migrate/19b0f62e33193d4d875e9e9dacf74b51.jpeg)
图19 查看java环境
图18、图19是java环境的安装与验证,mycat需要java环境。
步骤五、部署mycat
![d90bff09b64d8ba69cb201ec5299096b.png](https://i-blog.csdnimg.cn/blog_migrate/9c9434d396a543bc53ebcbcb151fc014.jpeg)
图20 mycat安装包上传到到服务器
![22bbd3ed6dae1da0eada0c9a64802d4f.png](https://i-blog.csdnimg.cn/blog_migrate/c580d1fae8397193b7905c5483b3bc79.jpeg)
图21 解压缩mycat到/usr/local/目录
![1f95ee1a83feb01e3eade1c7c3faceb8.png](https://i-blog.csdnimg.cn/blog_migrate/ee19d0b09560ff824f449c1ef5299b72.jpeg)
图22 配置mycat的环境并验证
图20、图21和图22是部署mycat的过程,mycat不是YUM包,是tar.gz包,导入到服务器上后解压缩到/usr/local下即可,并配置mycat的环境变量,使mycat变为系统服务的一部分。
步骤六、配置mycat
![a89fa7d803e67e8a27086fb63793ab3d.png](https://i-blog.csdnimg.cn/blog_migrate/c5977d6be3228e4f965b695663e829ee.jpeg)
图23 schema.xml
图23中,进入/usr/local/mycat/conf目录下,找到schema.xml文件,该文件是用标签语言写的,定义了要访问的数据库school,该数据库已在db1中提前创建,db1和db2自动同步,我们要对school进行读写分离操作,其中writeHost标签定义了“写”服务器的主机名db1和ip地址192.168.0.1,readHost标签定义了“读”服务器的主机名db2和ip地址192.168.0.2。
![0e44811ffb31eb354c0622c5bd493c9f.png](https://i-blog.csdnimg.cn/blog_migrate/9c888d99500dde9aa1e47e18342ba08e.jpeg)
图24 server.xml
图24中,也是在/usr/local/mycat/conf目录下,找到server.xml文件,红色部分定义了数据库名school,用户名root和密码123456,绿色部分没有用,直接删除掉,否则会影响实验效果。
步骤七、启动mycat并验证
![23dcb3966a11cf1458dfe49d2416b516.png](https://i-blog.csdnimg.cn/blog_migrate/bd6f33fbcf10023efcbfc5605ac3e038.jpeg)
图24 启动mycat服务
图24中,启动mycat服务,查看状态为running,且看到本机开放了9066和8066端口,即表示成功。
![3d10ae541103ee16811334499509cdbd.png](https://i-blog.csdnimg.cn/blog_migrate/daa2c940680ed896df19e1129001204c.jpeg)
图25 验证mycat服务
图25中,我们看到了验证结果,检查mycat的状态,我们发现db1标识W,db2表示R,读写分离完成,如果要更清楚的看到效果,用户可用一台客户机远程连接mycat服务器,如果对服务器进行写操作,insert、delete、update,就会发现db1的EXECUTE选项数字有变化,表示db1正在执行工作;而我们对服务器进行读操作,如select,就会发现db2的EXECUTE选项数字有变化,表示db2正在执行工作。读写工作就能看得更清楚了。
后序
读写操作的实现,可以让数据库服务器只针对一种操作,通过该方法,有效的减轻了单台数据库服务器既要响应读操作,也要响应写操作的烦恼,提高了单台服务器的运行效率。在实际的使用中,该架构广泛用在电商平台的后台数据库,往往是一群写操作服务器和一群读操作服务器共同构建了大型电商网站的后台数据库。而且你还会发现一个有趣的事情,写操作服务器的数量要远远少于读操作服务器。为什么呢?原因很简单,我们平时网上购物,其实大多数的行为都是在浏览、查询商品(读数据库),而真正购物下单的操作(写操作),其实并不多,也许我们为了买一件商品,往往要查看同类的十几种商品后,才能考虑下单。所以,为了合理分配服务器资源,“写”服务器数量会远远少于“读”服务器数量。好了,时间不早了,今天就讲到这里,洗洗睡了O(∩_∩)O。