企业级集群架构体系实战(一)

企业级集群架构体系实战(一)



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协议通信,提高效率,方便管理。

  1. 安装程序包
yum install nginx php php-fpm php-mbstrint php-mcrypt 
  1. 配置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;
    }
}
  1. 配置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
  1. 动态资源准备
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
  1. 在后端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;
  1. 启动所有服务

配置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
  1. 安装程序包及其他准备工作

    • 同步时间,关闭防火墙和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
  • 备份所有程序的原始配置文件

    1. 配置两台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 &quot;%r&quot; %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"/>
  1. 配置前端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
  1. 安装程序包及其他准备工作

    • 同步时间,关闭防火墙和selinux

    • node11和node12

安装程序包

#安装memcached程序包
yum install -y memcached
  1. 准备工作

    • 获取以下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
  1. 使用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服务

    1. 测试功能
  • 测试tomcat默认页面及管理页面,访问站点:

http://172.16.50.7/test

访问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]

创建主从复制集群

  1. 在主节点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
  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
  1. 启动主从节点的mariadb服务
systemctl start mariadb
  1. 登录主节点的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;
  1. 分别登录每个从节点的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;

实现主从复制架构的半同步复制

  1. 分别在主从节点上执行执行安装插件命令
#在主节点服务器上登录mysql客户端,执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
#在从节点服务器上登录mysql客户端,执行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
#查看插件的加载状态
SHOW PLUGINS;
  1. 启用插件

    • 主节点
#查看插件运行状态
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;
  1. 在从节点重启IO线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

实现主从复制架构的读写分离

  1. 安装proxysql程序
yum install ./proxysql-1.3.6-1-centos7.x86_64.rpm
  1. 修改配置文件
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"
    }
)
  1. 在node9(MySQL主节点)服务器上为ProxySQL代理节点建立用户并授权

注意:修改主节点数据库中的数据,从节点会自动同步修改数据

CREATE DATABASE mydb;
GRANT ALL ON *.* TO 'myadmin'@'192.168.50.%' IDENTIFIED BY'mypass';
FLUSH PRIVILEGES;
  1. 在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)
  1. 读写分离操作至此已经完成

实现Master节点的高可用——MHA

  1. 创建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/
  1. 获取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
  1. 初始化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
  1. 在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; ” 命令,刷新授权。

  1. 在MAH manager主机上验证各主机是否可以基于ssh实现自由通信
masterha_check_ssh --conf=/etc/masterha/app1.cnf
#成功信息
[info] All SSH connection tests passed successfully
  1. 在MAH manager主机上对各mysql主机进行健康状态监测
masterha_check_repl --conf=/etc/masterha/app1.cnf
#成功信息
MySQL Replication Health is OK.
  1. 在MAH manager主机上启动进程
nohup masterha_manager --conf=/etc/masterha/app1.cnf &>> /data/masterha/app1/manager.log &
  1. 在MAH manager主机上监测状态
masterha_check_status --conf=/etc/masterha/app1.cnf 
#显示结果
app1 (pid:4663) is running(0:PING_OK), master:192.168.50.9
  1. 停止MHA的方法:
masterha_stop --conf=/etc/masterha/app1.cnf
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值