企業級集羣架構體系實戰(一)
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