企业级集群架构体系实战(一)
1、试验拓扑图
总体层次划分拓扑简图
2、试验准备
- 服务器主机准备
根据本试验拓扑图,预计需要12台服务器主机
[web]
172.16.50.1 hostname=node1
172.16.50.2 hostname=node2
172.16.50.3 hostname=node3
172.16.50.4 hostname=node4
172.16.50.5 hostname=node5
172.16.50.6 hostname=node6
172.16.50.7 hostname=node7
172.16.50.8 hostname=node8
172.16.50.9 hostname=node9
172.16.50.10 hostname=node10
172.16.50.11 hostname=node11
172.16.50.12 hostname=node12
172.16.50.16 hostname=node16
172.16.50.17 hostname=node17
- 关闭防火墙和SELinux
iptables -F
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=permissive
- 同步时间
ntpdate 172.16.0.1
- 修改/etc/hosts文件实现node1与node2之间可通过主机名互相通信
3、前端接入层调度器部署及高可用配置 [node1,node2]
见《企业级集群架构体系实战(二)》。
4、缓存层部署及动静分离配置 [node3,node4]
见《企业级集群架构体系实战(二)》。
5、业务层动态资源服务器集群部署 [node6,node7,node11,node12]
php资源服务器(提供wordpress站点服务)配置 [node6]
node6节点主机提供nginx和php-fpm服务,在php前端设置nginx的原因是:可以让前端的缓存服务器集群与本服务器间采用http协议通信,提高效率,方便管理。
- 安装程序包
yum install nginx php php-fpm php-mbstrint php-mcrypt
- 配置nginx服务
#修改配置文件
vim /etc/nginx/conf.d/proxy_php.conf
#修改配置如下
server {
listen 80;
server_name 192.168.50.6;
location / {
root /data/web_resourse;
index index.php index.html;
}
location ~* \.php$ {
root /data/web_resourse;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/web_resourse$fastcgi_script_name;
include fastcgi_params;
}
location ~* ^/(pm_status|ping)$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}
}
- 配置php-fpm服务
vim /etc/php-fpm.d/www.conf
#修改如下几项配置条目
listen = 0.0.0.0:9000
#此行使用 " ; " 注释掉
;listen.allowed_clients = 127.0.0.1
user = nginx
group = nginx
pm.status_path = /pm_status
ping.path = /ping
- 动态资源准备
mkdir -pv /data/web_resourse;cd /data/web_resours
vim index.php
<?php
phpinfo();
?>
#将wordpress-4.7.4-zh_CN.zip 程序包放至此目录并解压
unzip wordpress-4.7.4-zh_CN.zip
ln -sv wordpress wp
chown -R nginx.nginx wordpress
chown nginx.nginx wp
cd wordpress
在后端mysql数据库中定义wordpress登录mysql所需的用户并授予权限
- 在mysql主节点服务器上登录后端数据库
mysql -uroot -hlocalhost -p
- 登录后执行
CREATE DATABASE wpdb;
GRANT ALL ON wpdb.* TO 'wpuser'@'192.168.50.%' IDENTIFIED BY 'wppass';
FLUSH PRIVILEGES;
注意:此处也可以直接制定ProxySQL服务器从而调用后端的具有读写分离功能的主从复制集群,需要在wordpress中填写另一个登录账户信息
具体见mysql集群中的读写分离配置
- 在ProxySQL主机上登录mysql集群(Proxysql主机的IP地址为192.168.50.17)
mysql -umyadmin -pmypass -h192.168.50.17
- 登录后执行
CREATE DATABASE wpdb;
- 启动所有服务
配置Tomcat动态资源服务
tomcat动态资源服务器集群成员的IP地址及角色分配:
node7 172.16.50.7 192.168.50.7 nginx(director) 前端调度器
node11 172.16.50.11 192.168.50.11 tomcat/memcached 动态资源服务器以及session server
node11 172.16.50.12 192.168.50.12 tomcat/memcached 动态资源服务器以及session server
安装程序包及其他准备工作
同步时间,关闭防火墙和selinux
node7
yum install nginx
- node11和node12
安装程序包
#安装jdk和tomcat相关程序包
yum install -y java-1.8.0-openjdk tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp
#安装memcached程序包
yum install -y memcached
设置java环境变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr
#加载该配置文件
source /etc/profile.d/java.sh
备份所有程序的原始配置文件
- 配置两台tomcat动态资源服务器
准备动态资源,定义test应用
#创建资源目录结构
mkdir /usr/share/tomcat/webapps/test/{WEB-INF,META-INF,lib,classes}
#创建 .jsp 文件
vim /usr/share/tomcat/webapps/test/index.jsp
#正文如下
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.achudk.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("achudk.com","achudk.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
<br>
<% out.println("hello tc1");
%>
</body>
</html>
#另一台tomcat服务器的index.jsp文件中将 "tomcatA" 替换为 "tomcatB" 、将 "hello tc1" 替换为 "hello tc2" 。
- 修改配置文件
vim /etc/tomcat/server.xml
#在文件尾部的<Host>配置段后面重新定义一个<Host>配置段,如下:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="test" reloadable="true">
#<Manager>配置段作用为:配置memcached提供session server功能,若不开启此功能可删除此段配置
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.16.50.11:11211,n2:172.16.50.12:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
/>
</Context>
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
- 启用tomcat默认页的manager和host-manager管理功能,修改管理功能的用户配置文件
vim /etc/tomcat/tomcat-user.xml
#增加以下三项
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,manager-gui"/>
配置前端nginx调度器
- 在nginx节点主机执行:
vim /etc/nginx/conf.d/proxy_tomcat.conf
#内容如下
upstream tcsrvs {
server 172.16.50.11:8080;
server 172.16.50.12:8080;
}
server {
listen 80;
server_name 172.16.50.7;
location / {
proxy_pass http://tcsrvs;
}
}
- 启动tomcat服务,测试两台服务器的test应用是否正常工作
6、会话服务器集群部署及主备冗余配置 [node11,node12]
session server服务器集群成员的IP地址及角色分配:
node11 172.16.50.11 192.168.50.11 memcached session server
node11 172.16.50.12 192.168.50.12 memcached session server
安装程序包及其他准备工作
同步时间,关闭防火墙和selinux
node11和node12
安装程序包
#安装memcached程序包
yum install -y memcached
准备工作
- 获取以下5个 .jar文件
javolution-5.4.3.1.jar
memcached-session-manager-2.1.1.jar
memcached-session-manager-tc7-2.1.1.jar
msm-javolution-serializer-2.1.1.jar
spymemcached-2.11.1.jar
使用memcached配置两台服务器成为具有冗余能力的session server
- 将以下 .jar 类文件放置于指定位置
mv javolution-5.4.3.1.jar\
memcached-session-manager-2.1.1.jar\
memcached-session-manager-tc7-2.1.1.jar\
msm-javolution-serializer-2.1.1.jar\
spymemcached-2.11.1.jar\
/usr/share/java/tomcat/
启动memcached服务,并重启tomcat服务
- 测试功能
测试tomcat默认页面及管理页面,访问站点:
访问http://172.16.50.7:8080/test/,结果为
#
Tomcat Server A
Session ID 67FB8590C1DC933795BF7FD999CF106E-n1
Created on 1500705152610
hello tc1
#
Tomcat Server B
Session ID 67FB8590C1DC933795BF7FD999CF106E-n1
Created on 1500705152610
hello tc2
- 验证结果:调度到两台tomcat服务器,会话ID一致。
7、结构化数据库(MySQL)集群配置部署及主从半同步复制、读写分离、Master高可用配置 [node17,node9,192.node10,node16]
创建主从复制集群
- 在主节点node9
vim /etc/my.cnf.d/server.cnf
[mysqld]
innodb_file_per_table=ON
skip_name_resolve=ON
server_id=1
log_bin=master-log
relay_log=relay-log
sync_binlog=1
- 在从节点node10和node16设置
vim /etc/my.cnf.d/server.cnf
[mysqld]
innodb_file_per_table=ON
skip_name_resolve=ON
server_id=2
relay_log=relay-log
log_bin=master-log
relay_log_purge=0
read-only=1
sync_master_info=1
sync_relay_log_info=1
- 启动主从节点的mariadb服务
systemctl start mariadb
- 登录主节点的mysql客户端,执行:
GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.50.%' IDENTIFIED BY 'replpass';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'repluser'@'192.168.50.%';
SHOW MASTER STATUS;
- 分别登录每个从节点的mysql客户端,分别执行:
CHANGE MASTER TO MASTER_HOST='192.168.50.9',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_PORT=3306,MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=498;
SHOW SLAVE STATUS\G;
START SLAVE;
实现主从复制架构的半同步复制
- 分别在主从节点上执行执行安装插件命令
#在主节点服务器上登录mysql客户端,执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
#在从节点服务器上登录mysql客户端,执行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
#查看插件的加载状态
SHOW PLUGINS;
启用插件
- 主节点
#查看插件运行状态
SHOW GLOBAL VARIABLES LIKE '%semi_sync%';
#启用插件
SET @@global.rpl_semi_sync_master_enabled=ON;
- 从节点
#查看插件运行状态
SHOW GLOBAL VARIABLES LIKE '%semi%';
#启用插件
SET @@global.rpl_semi_sync_slave_enabled=ON;
- 在从节点重启IO线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
实现主从复制架构的读写分离
- 安装proxysql程序
yum install ./proxysql-1.3.6-1-centos7.x86_64.rpm
- 修改配置文件
cp /etc/proxysql.cnf{,.bak}
vim /etc/proxysql.cnf
#file proxysql.cfg
datadir="/var/lib/proxysql"
admin_variables=
{
admin_credentials="admin:admin"
mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
# refresh_interval=2000
# debug=true
}
#修改mysql_variables配置段
mysql_variables=
{
threads=4
max_connections=2048
default_query_delay=0
default_query_timeout=36000000
have_compress=true
poll_timeout=2000
interfaces="0.0.0.0:3306;/tmp/proxysql.sock"
default_schema="mydb"
stacksize=1048576
server_version="5.5.30"
connect_timeout_server=3000
monitor_history=600000
monitor_connect_interval=60000
monitor_ping_interval=10000
monitor_read_only_interval=1500
monitor_read_only_timeout=500
ping_interval_server=120000
ping_timeout_server=500
commands_stats=true
sessions_sort=true
connect_retries_on_failure=10
}
#修改mysql_servers配置段
mysql_servers =
(
{
address = "192.168.50.9"
port = 3306
hostgroup = 0
status = "ONLINE"
weight = 1
compression = 0
max_replication_lag = 200
},
{
address = "192.168.50.10"
port = 3306
hostgroup = 1
status = "ONLINE"
weight = 1
compression = 0
max_replication_lag = 500
},
{
address = "192.168.50.16"
port = 3306
hostgroup = 1
status = "ONLINE"
weight = 1
compression = 0
max_replication_lag = 500
}
)
#修改mysql_user配置段
mysql_users:
(
{
username = "myadmin"
password = "mypass"
default_hostgroup = 0
active = 1
default_schema="mydb"
}
)
#定义读写分离配置段
mysql_replication_hostgroups=
(
{
writer_hostgroup=0
reader_hostgroup=1
comment="test repl 1"
}
)
- 在node9(MySQL主节点)服务器上为ProxySQL代理节点建立用户并授权
注意:修改主节点数据库中的数据,从节点会自动同步修改数据
CREATE DATABASE mydb;
GRANT ALL ON *.* TO 'myadmin'@'192.168.50.%' IDENTIFIED BY'mypass';
FLUSH PRIVILEGES;
- 在node17启动proxysql服务并连接本地mysql服务
#启动proxysql服务
service proxysql start
ss -tnl
#使用预先建立的账号密码登录node9服务器
mysql -umyadmin -pmypass -h192.168.50.17
#登录成功后会显示下面提示信息
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.30 (ProxySQL)
- 读写分离操作至此已经完成
实现Master节点的高可用——MHA
- 创建ssh密钥,使任意两台主机间能够通过ssh自由通信
此处为了操作简单,可以使所有主机的密钥相同,具体做法为:在任意一台主机上生成一对密钥,将密钥发送至所有主机的对应目录下。
#假如在node9节点主机上执行
ssh-keygen -t rsa -P ''
ssh-copy-id -i id_rsa.pub root@192.168.50.9
#测试ssh连接可用性并更新know_hosts文件内容
ssh root@192.168.50.9 'ip a'
ssh root@192.168.50.10 'ip a'
ssh root@192.168.50.16 'ip a'
ssh root@192.168.50.17 'ip a'
#
scp -p id_rsa authorized_keys id_rsa.pub known_hosts root@192.168.50.10:/root/.ssh/
scp -p id_rsa authorized_keys id_rsa.pub known_hosts root@192.168.50.16:/root/.ssh/
scp -p id_rsa authorized_keys id_rsa.pub known_hosts root@192.168.50.17:/root/.ssh/
获取mha4mysql-manager和mha4mysql-node两个程序包并安装
- 在manager主机上需要同时安装manager和node包
yum install ./mha4mysql-manager-0.56-0.el6.noarch.rpm ./mha4mysql-node-0.56-0.el6.noarch.rpm
- 在node主机上仅需安装mha4mysql-node包
yum install ./mha4mysql-node-0.56-0.el6.noarch.rpm
- 初始化MHA
此处仅设置一个备用master节点
#创建目录
mkdir /etc/masterha
#创建、修改并增加配置文件内容
vim /etc/masterha/app1.cnf
[server default]
user=mhaadmin
password=mhapass
manager_workdir=/data/masterha/app1
manager_log=/data/masterha/app1/manager.log
remote_workdir=/data/masterha/app1
ssh_user=root
repl_user=repladmin
repl_password=replpass
ping_interval=1
[server1]
hostname=192.168.50.9
candidate_master=1
[server2]
hostname=192.168.50.10
candidate_master=1
[server3]
hostname=192.168.50.16
#设置为0,表示不作为主节点的备用节点
candidate_master=0
- 在node9主节点服务器上为mha创建并授权用户
GRANT ALL ON *.* TO 'mhaadmin'@'192.168.50.%' IDENTIFIED BY 'mhapass';
GRANT ALL ON *.* TO 'repladmin'@'192.168.50.%' IDENTIFIED BY 'replpass';
FLUSH PRIVILEGES;
注意:此处需要在所有从节点上登录mysql客户端并执行 ” FLUSH PRIVILEGES; ” 命令,刷新授权。
- 在MAH manager主机上验证各主机是否可以基于ssh实现自由通信
masterha_check_ssh --conf=/etc/masterha/app1.cnf
#成功信息
[info] All SSH connection tests passed successfully
- 在MAH manager主机上对各mysql主机进行健康状态监测
masterha_check_repl --conf=/etc/masterha/app1.cnf
#成功信息
MySQL Replication Health is OK.
- 在MAH manager主机上启动进程
nohup masterha_manager --conf=/etc/masterha/app1.cnf &>> /data/masterha/app1/manager.log &
- 在MAH manager主机上监测状态
masterha_check_status --conf=/etc/masterha/app1.cnf
#显示结果
app1 (pid:4663) is running(0:PING_OK), master:192.168.50.9
- 停止MHA的方法:
masterha_stop --conf=/etc/masterha/app1.cnf