Fork me on GitHub
行锋

低头走路,抬头思考


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

  • 搜索

JDBC链接MySQL8的注意事项

发表于 2019-02-26 | 分类于 Java
  • 需要使用高版本的JDBC驱动,“mysql-connector-java 8”以上版本,具体可通过数据库版本取maven库中查看驱动版本
  • JDBC driver 由“com.mysql.jdbc.Driver”改为“com.mysql.cj.jdbc.Driver

Docker环境下的前后端分离项目部署与运维

发表于 2019-02-24 | 分类于 docker

学习视频:https://coding.imooc.com/learn/list/219.html

简介

人人开源项目:https://www.renren.io/
项目部署图解:
image
image
image

开发环境要求

软件:宿主机-Vmware虚拟机(CentOS/Ubuntu)-Docker虚拟机

MySQL集群

单节点数据库无法满足性能上的要求及高可用冗余设计,大型互联网程序用户群体庞大,架构必须特殊设计,mysql常见集群方案:
image

PXC方案原理

PXC(Percona XtraDB Cluster):建议PXC使用PerconaServer(MySQL改进版,性能提升很大)
image
PXC数据强一致性:同步复制,事物在所有集群节点要么同时提交,要么不提交

PXC集群搭建

网络准备:

1
2
docker network create --subnet=172.18.0.0/24 net1
docker network inspect net1 //查看网络详细信息

准备数据卷:

1
2
3
4
5
6
7
docker volume create --name v1
docker inspect v1 //查看volume在宿主机上的实际路径,方便后期做容器卷映射
docker volume create v2
docker volume create v3
docker volume create v4
docker volume create v5
docker volume create ‐‐name backup //创建备份数据卷用于热备份数据

创建pxc容器:每个MySQL容器创建之后,因为要执行PXC的初始化和加入集群等工作,耐心等待1分钟左右再用客户 端连接MySQL。另外,必须第1个MySQL节点启动成功,用MySQL客户端能连接上之后,再去创建其他 MySQL节点。

1
2
3
4
5
6
7
8
9
10
11
docker pull percona/percona-xtradb-cluster
//创建第一个节点
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 percona/percona-xtradb-cluster
//创建第二个节点
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 percona/percona-xtradb-cluster
//创建第三个节点
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql -v backup:/data --privileged --name=node3 --net=net1 --ip 172.18.0.4 percona/percona-xtradb-cluster
//创建第四个节点
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql -v backup:/data --privileged --name=node4 --net=net1 --ip 172.18.0.5 percona/percona-xtradb-cluster
//创建第五个节点
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 percona/percona-xtradb-cluster

通过客户端测试数据库集群:

  • 输入数据库ip为宿主机ip,端口为映射ip,如:3307、3308等连接不同节点
  • 任意节点建库、建表测试是否同步

数据库集群的负载均衡

image
使用Haproxy做负载均衡,请求被均匀分发给每个节点,单节点负载低,性能好
image

haproxy使用

  1. docker pull haproxy //获取haproxy系统镜像
  2. 创建haproxy配置文件: sudo vim /media/psf/LinuxShare/data/conf/haproxy.cfg,更多配置查看:https://zhang.ge/5125.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
global
#工作目录
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
log 127.0.0.1 local5 info
#守护进程运行
daemon

defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时(毫秒)
timeout connect 5000
#客户端超时(毫秒)
timeout client 50000
#服务器超时(毫秒)
timeout server 50000

#监控界面
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:admin
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:3306
#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
option mysql-check user haproxy
server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
  1. 创建haproxy容器
1
2
3
4
5
#创建第1个Haproxy负载均衡服务器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /media/psf/LinuxShare/data/conf:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.10 haproxy

#创建第2个Haproxy负载均衡服务器
docker run -it -d -p 4003:8888 -p 4004:3306 -v /media/psf/LinuxShare/data/conf:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.11 haproxy
  1. 创建数据库haproxy用户:create user ‘haproxy’@’%’ identified by ‘’;
  2. 启动haproxy
1
2
3
4
5
docker exec -it h1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

docker exec -it h2 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  1. 浏览器访问:
    浏览器访问地址:http://宿主机ip:4001/dbs
  2. 数据库访问:
    ip为宿主机ip,端口4002,见第三步
  3. 测试节点宕机
  • docker stop node1;查看浏览器,node1节点是否宕机
  • 恢复node1节点:删除node1节点,重新以从节点方式创建node1即可
1
2
docker rm node1
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node2 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 percona/percona-xtradb-cluster

虚拟IP地址技术

keepalived实现双机热备

image

  • Keepalived必须安装在haproxy容器内
1
2
3
4
5
docker exec -it h1 bash
apt-get update
apt-get install vim
apt-get install keepalived
vim /etc/keepalived/keepalived.conf

配置文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vrrp_instance  VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.0.201
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
virtual_server 192.168.99.150 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 8888 {
weight 1
}
}
virtual_server 192.168.99.150 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306 {
weight 1
}
}

暂停PXC集群的办法

  • 在/etc/sysctl.conf文件末尾添加:net.ipv4.ip_forward=1;重启网络服务:systectl restart network

Replication方案原理

image
Replication采用异步复制,单向同步,无法保证数据的一致性

参考文章:

  • https://www.cnblogs.com/zhenyuyaodidiao/p/4635458.html
  • https://www.cnblogs.com/clsn/p/8150036.html

–sql
stop slave;
show slave status;

PXC集群安装

MySQL集群(PXC)入门:https://www.imooc.com/learn/993

Redis集群

高速缓存:利用内存保存数据,读写速度远超硬盘;减少I/O操作

Redis集群方案

  • RedisCluster:官方推荐,没有中心节点,客户端与redis节点直连,不需要中间代理层;数据可被分片存储;管理方便,后续可自行增删节点
  • Codis:中间件产品,存在中心节点,360公司产品
  • Twemproxy:中间件产品,存在中心节点
  • Redis集群中应该包含奇数个Master,至少应该有3个Master
  • Redis集群中每个Master都应该有Slave
    image
  • redis集群不配置负载均衡是因为在前后端分离项目中Spring程序实现了负载均衡

RedisCluster架构

image

Redis主从同步

  • Redis集群中的数据库复制是通过主从同步来实现的
  • 主节点(Master)把数据分发给从节点(Slave)
  • 主从同步的好处在于高可用,Redis节点有冗余设计

RedisCluster集群搭建

网络准备:

1
docker network create --subnet=172.19.0.0/16 net2

镜像准备:

1
2
docker pull grokzen/redis-cluster
docker pull yyyyttttwwww/redis //课程使用

容器创建:

1
2
3
4
5
6
docker run -it -d --name r1 -p 5001:6379 --net=net2 --ip 172.19.0.2 yyyyttttwwww/redis bash
docker run -it -d --name r2 -p 5002:6379 --net=net2 --ip 172.19.0.3 yyyyttttwwww/redis bash
docker run -it -d --name r3 -p 5003:6379 --net=net2 --ip 172.19.0.4 yyyyttttwwww/redis bash
docker run -it -d --name r4 -p 5004:6379 --net=net2 --ip 172.19.0.5 yyyyttttwwww/redis bash
docker run -it -d --name r5 -p 5005:6379 --net=net2 --ip 172.19.0.6 yyyyttttwwww/redis bash
docker run -it -d --name r6 -p 5006:6379 --net=net2 --ip 172.19.0.7 yyyyttttwwww/redis bash

配置redis配置文件:(默认关闭了redis集群功能)

1
2
3
4
5
6
7
8
9
//逐个进入容器,如:
docker exec -it r1 bash
//逐个配置
daemonize yes
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
appendonly yes //开启AOF日志模式

逐个启动redis服务

1
2
3
/usr/redis/src/redis-server /usr/redis/redis.conf
//客户端连接测试,如:
./redis-cli -h 172.19.0.3 -p 6379 -c

通过redis-trib.rb(redis自带,需要ruby环境)创建集群

1
2
3
4
5
6
7
8
//进入任一容器,如:
docker exec -it r1 bash
cd /usr/redis/
mkdir cluster
cp src/redis-trib.rb cluster/
cd cluster/
//创建集群,过程中确认请输入"yes"
./redis-trib.rb create --replicas 1 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.6:6379 172.19.0.7:6379

测试集群效果

1
2
3
4
//逐个任一容器,如:
docker exec -it r1 bash
./redis-cli -c
cluster nodes //查看集群节点信息

Docker Compose

  • Docker-Compose用于解决容器与容器之间如何管理编排的问题
  • Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。

Compose 中有两个重要的概念

  • 服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
  • 项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义

Docker Compose 安装

Docker Compose 是 Docker 的独立产品,需自行安装

1
2
3
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v

基本使用

  • 启动服务:docker-compose up -d //在后台启动服务
  • 查看启动的服务:docker-compose ps
  • 停止服务: docker-compose stop

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#查看帮助
docker-compose -h

# -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d

#启动所有容器,-d 将会在后台启动并运行所有的容器
docker-compose up -d

#停用移除所有容器以及网络相关
docker-compose down

#查看服务容器的输出
docker-compose logs

#列出项目中目前的所有容器
docker-compose ps

#构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务
docker-compose build

#拉取服务依赖的镜像
docker-compose pull

#重启项目中的服务
docker-compose restart

#删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
docker-compose rm

#在指定服务上执行一个命令。
docker-compose run ubuntu ping docker.com

#设置指定服务运行的容器个数。通过 service=num 的参数来设置数量
docker-compose scale web=3 db=2

#启动已经存在的服务容器。
docker-compose start

#停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
docker-compose stop

Docker Swarm

课后作业

源码解析

https://www.jianshu.com/p/259d35eef3f1

Java开发其他配置

发表于 2019-02-21 | 分类于 环境搭建

maven配置

官网:http://maven.apache.org/
下载:http://maven.apache.org/download.cgi

  1. 下载解压安装包:tar zvxf apache-maven-3.5.0-bin.tar.gz
  2. 配置maven环境变量:sudo vim /etc/profile,编辑系统配置文件
1
2
3
#set Maven environment
export MAVEN_HOME=/usr/local/software/dir-maven/apache-maven-3.5.0
export PATH=$MAVEN_HOME/bin:$PATH

source /etc/profile
3. 执行mvn -v查看是否安装完成

配置maven的镜像仓库

  • 在conf目录中找到settings.xml 文件,配置mirrors的子节点,添加如下mirror
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//阿里云Maven镜像:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
或开源中国maven镜像
<mirror>
<id>nexus-osc</id>
<mirrorOf>*</mirrorOf>
<name>Nexus osc</name>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>

MQTT入门

发表于 2019-02-20 | 分类于 Java

简介

官网:http://mqtt.org/

  • MQTT(英语全称,Message Queue Telemetry Transport),中文翻译过来就是遥测传输协议,是一个轻量级的消息总线协议,提供消息订阅与发布,属于物联网(Internet of Thing)的一个传输协议
  • 主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN
  • MQTT是一套标准,常用的服务端有Eclipse的Mosquitto。MQTT是IBM出品,Eclipse也是IBM出品,所以Mosquitto算是官方实现吧
  • MQTT在通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

MQTT协议中文版: https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html

消息发布服务质量(QoS)

为了满足不同的场景,MQTT支持三种不同级别的服务质量(Quality of Service,QoS)为不同场景提供消息可靠性:

  • 级别0:尽力而为,“至多一次”。消息发布完全依赖底层TCP/IP网络,遇到意外并不会重试,会发生消息丢失或重复,这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了
  • 级别1:“至少一次”,确保消息到达,但消息重复可能会发生。
  • 级别2:“只有一次”,确保消息到达一次

实现方式

  • 实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)
  • 消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

  • Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
  • payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

消息类型

MQTT拥有14种不同的消息类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CONNECT:客户端连接到MQTT代理
CONNACK:连接确认
PUBLISH:新发布消息
PUBACK:新发布消息确认,是QoS 1给PUBLISH消息的回复
PUBREC:QoS 2消息流的第一部分,表示消息发布已记录
PUBREL:QoS 2消息流的第二部分,表示消息发布已释放
PUBCOMP:QoS 2消息流的第三部分,表示消息发布完成
SUBSCRIBE:客户端订阅某个主题
SUBACK:对于SUBSCRIBE消息的确认
UNSUBSCRIBE:客户端终止订阅的消息
UNSUBACK:对于UNSUBSCRIBE消息的确认
PINGREQ:心跳(空闲时发一个)
PINGRESP:确认心跳
DISCONNECT:客户端终止连接前优雅地通知MQTT代理

mosquitto

一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单

1
2
3
4
5
6
7
8
mosquitto – 代理器主程序
mosquitto.conf – 配置文件
mosquitto_passwd – 用户密码管理工具
mosquitto_tls – very rough cheat sheet for helping with SSL/TLS
mosquitto_pub – 用于发布消息的命令行客户端
mosquitto_sub – 用于订阅消息的命令行客户端
mqtt – MQTT的后台进程
libmosquitto – 客户端编译的库文件

安装

1
2
3
sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients
sudo service mosquitto status //测试mosquitto运行状态

测试

订阅主题

1
mosquitto_sub -h 10.211.55.3 -t "mtopic" -v

再打开一个终端,发布主题

1
mosquitto_pub -h 10.211.55.3 -t "mtopic" -m "Hello mqtt"

更多配置

  • 更多配置参数讲解,参考:https://www.cnblogs.com/saryli/p/9812452.html
  • mosquitto默认可匿名访问,password-file密码文件,acl_file访问控制列表,通过mosquitto.conf启用,编辑文末添加如下:
1
2
3
allow_anonymous false
password_file /etc/mosquitto/pwfile.conf
acl_file /etc/mosquitto/aclfile.conf
  • 准备配置的相关配置文件
1
2
3
4
cd /usr/share/doc/mosquitto/examples/
sudo cp aclfile.example /etc/mosquitto/aclfile.conf
sudo cp pwfile.example /etc/mosquitto/pwfile.conf
sudo cp pskfile.example /etc/mosquitto/pskfile.conf
  • 添加用户
    添加用户admin、mosquitto,密码同用户名
1
2
sudo mosquitto_passwd -b /etc/mosquitto/pwfile.conf mosquitto mosquitto
sudo mosquitto_passwd -b /etc/mosquitto/pwfile.conf admin admin
  • 关联Topic和用户
    admin设置为订阅权限,并且只能访问的主题为"root/topic/#",mosquitto 设置为发布权限,并且只能访问的主题为"root/topic/#",编辑aclfile.conf:
1
2
3
4
user admin
topic read mtopic/#
user mosquitto
topic write mtopic/#

read 订阅权限 、write 发布权限、# 通配符表示所有的

  • 重启服务,测试配置
1
2
3
4
ps -aux|grep mosquitto
sudo kill -9 pid
ps -aux|grep mosquitto
sudo mosquitto -c /etc/mosquitto/mosquitto.conf -d
  • 启动订阅端
1
mosquitto_sub -h localhost -t "mtopic" -u mosquitto -P mosquitto -v
  • 启动发布端
    再打开一个终端
1
mosquitto_pub -h localhost -t "mtopic" -u admin -P admin -m "Hello mqtt user"

Java实现

Maven依赖 MQTT的Java客户端的使用

1
2
3
4
5
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>${mqtt.version}</version>
</dependency>

代码实现参考:
https://www.cnblogs.com/sxkgeek/p/9140180.html

zookeeper入门

发表于 2019-02-20 | 分类于 Java

image

简介

  • 中间件,提供协调服务
  • 作用于分布式系统,发挥其优势,可以为大数据服务
  • 支持java,提供java和c语言对客户端api

zookeeper=文件系统+监听通知机制

分布式系统

  • 很多台计算机组成一个整体,一个整体一致对外并且处理同一请求
  • 内部的每台计算机都可以相互通信(rest/rpc)
  • 客户端到服务端的一次请求到响应结束会历经多台计算机

自行搜索图解

zookeeper的特性

  • 一致性:数据一致性,数据按顺序分批入库
  • 原子性:事物要么成功要么失败,不会局部化
  • 单一视图:客户端连接集群中任一zk节点,数据都是一致的
  • 可靠性:每次对zk的操作状态都会保存在服务端
  • 实时性:客户端可以读取到zk服务端的最新数据

安装配置

官网: http://zookeeper.apache.org/

Linux安装

下载: https://archive.apache.org/dist/zookeeper/
解压文件到/usr/local/后配置环境:vim /etc/profile,添加:

1
2
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

macOS安装

brew install zookeeper //安装位置/usr/local/etc/zookeeper

https://blog.csdn.net/whereismatrix/article/details/50420099

安装启动遇到问题及解决:

  • https://www.jianshu.com/p/5cd618ad381e
  • https://flyer0126.iteye.com/blog/2230958

zookeeper主要目录结构

image

zookeeper配置文件介绍

  • cp conf/zoo_sample.cfg conf/zoo.cfg
  • tickTime
  • dataDir必须配置
  • dataLogDir建议配置,否则和dataDir公用
  • clientPort

zookeeper数据模型

  • 是一个树形结构,类似于前端开发中的tree.js组件
  • zk的数据模型也可以理解为unix/linux的文件目录
  • 每一个节点都成为znode,他可以有自节点,也可以有数据
  • 每个节点分为临时节点和永久节点,临时节点在客户端断开后消失
  • 每个zk节点都有各自的版本号,可以通过命令行来显示节点信息
  • 每当节点数据发生变化,那么该节点的版本号会累加(乐观锁)
  • 删除/修改过时的节点,版本号不匹配则会报错
  • 每个zk节点存储的数据不宜过大,几k即可
  • 节点可以设置权限acl,可以通过权限来限制用户的访问

基本操作:

  • 客户端连接:bin/zkCli.sh 可以输入help回车查看支持的命令
  • 查看znode结构: ls命令,一层层查看
  • 关闭客户端连接: ctrl+c

zookeeper作用体现

  • master节点选举,主节点挂了之后,从节点就会接手工作,并且保证这个节点是唯一的,这也是所谓的首脑模式,从而保证我们集群是高可用的
  • 统一配置文件管理,即只需部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算中用的特别多(假设修改了redis统一配置)
  • 发布与订阅,类似于消息队列MQ(amq,rmq…),dubbo发布者把数据存在znode上,订阅者会读取这个数据
  • 提供分布式锁,分布式环境中不通进程之间争夺资源,类似于多线程中的锁
  • 集群管理,集群中保证数据的强一致性

四种类型的znode

  • PERSISTENT-持久化目录节点:客户端与zookeeper断开连接后,该节点依旧存在
  • PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点:客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
  • EPHEMERAL-临时目录节点:客户端与zookeeper断开连接后,该节点被删除
  • EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点:客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

监听通知机制

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

Zookeeper客户端的使用

  • zkCli.sh:可使用./zkCli.sh -server localhost来连接到Zookeeper服务上
  • Java客户端:可创建org.apache.zookeeper.ZooKeeper对象来作为zk的客户端,注意,java api里创建zk客户端是异步的,为防止在客户端还未完成创建就被使用的情况,这里可以使用同步计时器,确保zk对象创建完成再被使用
  • C客户端

zookeeper常用命令行操作

image

启动服务:./zkServer.sh,连接客户端进入命令行后台:./zkCli.sh

  • ls与ls2
  • get与stat

zk特性-session的基本原理:客户端与服务端之间的连接存在会话;每个会话都可以设置一个超时时间;心跳结束,session则过期;session过期则临时节点znode会被抛弃

心跳机制:客户端向服务端的ping包请求

zk特性-watcher机制:针对每个节点的操作,都会有一个监督者watcher;当监控的某个znode发生了变化则出发watcher事件;zk中的watcher是一次性的,触发后立即销毁;父节点、子节点增删改都能触发其watcher

事件触发的类型及分类

ACL(access control lists)权限控制

  • 针对节点可以设置相关读写等权限,目的为了保障数据安全性
  • 权限permissions可以指定不同的权限范围以及角色

登录: addauth digest imooc:imooc

acl命令行

  • getAcl:获取某个节点的acl权限信息
  • setAcl:设置某个节点的acl权限信息
  • addauth:输入认证授权信息,注册时输入明文密码(登录),但在zk的系统里,密码是以加密的形式存在的

zk的acl通过[scheme🆔permissions]来构成权限列表:

  1. scheme:代表采用的某种权限机制
  • world:它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的
  • auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication)
  • digest:它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication
  • ip:: 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段
  • super:代表超级管理员,拥有所有的权限
1
2
3
4
//修改zkServer.sh增加super管理员
![image](/pub-images/super设置.png)

//重启zkServer.sh
  1. id:代表允许访问的用户
  2. permissions:权限组合字符串(crdwa)
  • create:创建子节点
  • read:获取节点/子节点
  • write:设置节点数据
  • delete:删除子节点
  • admin:设置权限

acl常用使用场景

  • 开发/测试环境分离,开发者无权限操作测试库的节点,只能看
  • 生产环境上控制指定ip的服务可以访问相关节点,防止混乱

zookeeper四字命令

  • zk可以通过他自身提供的简写命令来和服务器进行交互
  • 需要使用到nc命令,安装:yum install nc
  • echo [command] | nc [ip] [port],如:echo ruok | nc localhost 2181
  • stat:查看zk的状态信息,以及是否mode
  • ruok:查看当前zkServer是否启动,返回imok
  • dump: 列出未经处理的会话和临时节点
  • conf:查看服务器配置
  • cons:展示连接到服务器的客户端信息
  • envi:展示环境变量
  • mntr:监控zk健康信息
  • wchs:展示watcher信息

白名单设置

zookeeper集群搭建

  • zk集群,主从节点,心跳机制(选举模式),服务器数:2n+1

注意事项:

  • 配置数据文件 myid 1/2/3 对应server.1/2/3
  • 通过./zkCli.sh -server [ip]:[port]检测集群是否配置成功
  • 通过./zkServer.sh status查看zk节点在集群中的状态

集群搭建前置

在本地单机配置zk启动及一般操作正常,假设本地zk目录为:/usr/zookeeper

单机伪分布式zk集群搭建

  1. 准备zk单个节点
1
2
3
4
sudo mkdir /usr/zookerperGroup
sudo cp /usr/zookeeper /usr/zookerperGroup/zk1
sudo cp /usr/zookeeper /usr/zookerperGroup/zk2
sudo cp /usr/zookeeper /usr/zookerperGroup/zk3
  1. 修改相关配置
    依次进入zk1、zk2、zk3的conf目录,编辑zoo.cfg文件:
  • 修改clientPort依次为:2191,2192,2193
  • 修改dataDir、dataLogDir路径为:usr/zookerperGroup/zk{X}/data和usr/zookerperGroup/zk{X}/dataLog
  • 在文件末添加如下内容:(此处IP地址也可改为实际地址)
1
2
3
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

此配置需细心,切不可漏配、少配,我的配置如下图:
image
3. 创建myid文件

  • 依次进入zk1、zk2、zk3的data目录,sudo vim myid,输入内容依次为:1,2,3保存
  1. 依次启动zk服务
  • 依次进入zk1、zk2、zk3的bin目录,启动zk服务:sudo ./zkServer.sh start
  1. 测试集群
  • 进入zk1的bin,连接zk服务器,如:sudo zkCli.sh -server 127.0.0.1:2191
  • 在zk1中创建节点:create /test Hello
  • 进入zk2的bin,连接zk服务器,如:sudo zkCli.sh -server 127.0.0.1:2192
  • 获取test节点信息,如:ls /;get /test
  • 通过sudo ./zkServer status查看集群节点信息

真实环境zk集群搭建

  • 需注意:环境变量的配置,ip配置不同,端口号可以相同
  • 真实环境就是在多台机器间搭建zk集群,个人的话可通过虚拟机虚拟多台机器的方式学习,此处记录和单机伪分布式部署的不同及简单步骤:
  1. 在需要搭建集群的节点机器按照本文【安装配置】中方式完成安装和系统环境变量设置;
  2. 配置各机器网络,保证各机器网络互通,假设有3台机器,其ip地址为:192.168.1.111/112/113
  3. 修改各台机器的zoo.cfg配置文件
  • 配置各机器端口为统一端口,如默认:2181
  • 配置dataDir和dataLogDir,尽量各机器保持一致
  • 在各机器zoo.cfg文末添加集群配置,如:
1
2
3
server.1=192.168.1.111:2888:3888
server.1=192.168.1.112:2888:3888
server.1=192.168.1.113:2888:3888
  1. 在各机器创建myid文件,sudo vim myid,输入内容依次为:1,2,3保存
  2. 进入各机器,启动zk服务:sudo ./zkServer.sh start
  3. 测试集群节点状态:sudo ./zkServer status,通过sudo ./zkCli.sh -server 192.168.1.111:2181,同时通过如上单机伪分布式方式测试数据同步;强制关闭主节点测试主节点选举等

API操作相关代码

ZooKeeper的api支持多种语言,在操作时可以选择使用同步api还是异步api。同步api一般是直接返回结果,异步api一般是通过回调来传送执行结果的,一般方法中有某参数是类AsyncCallback的内部接口,那么该方法应该就是异步调用,回调方法名为processResult。

具体操作代码详见:

缺点:

  • 超时重连不支持自动,需手动重连
  • watch注册一次后会失效
  • 不支持递归创建节点

Apache Curator客户端使用

http://curator.apache.org/

Curator的Maven依赖如下,一般直接使用curator-recipes就行了,如果需要自己封装一些底层些的功能的话,例如增加连接管理重试机制等,则可以引入curator-framework包。

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apach e.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.1.0</version>
</dependency>
  • curator引入,版本要和zookeeper匹配,具体参考:http://curator.apache.org/zk-compatibility.html
  • curator重试连接策略:ExponentialBackoffRetry、RetryNTimes、RetryOneTimes、RetryUntilElapsed
  • Curator提供了三种Watcher(Cache)来监听结点的变化:
  1. Path Cache:监视一个路径下1)孩子结点的创建、2)删除,3)以及结点数据的更新。产生的事件会传递给注册的PathChildrenCacheListener。
  2. Node Cache:监视一个结点的创建、更新、删除,并将结点的数据缓存在本地。
  3. Tree Cache:Path Cache和Node Cache的“合体”,监视路径下的创建、更新、删除事件,并缓存路径下所有孩子结点的数据。

参考文章

  • https://www.cnblogs.com/seaspring/p/5536338.html
  • https://www.cnblogs.com/leocook/p/zk_0.html
  • https://www.cnblogs.com/gaojy/p/6635026.html
  • https://www.cnblogs.com/niechen/p/8597344.html
  • https://blog.csdn.net/java_66666/article/details/81015302

JWT(JSON Web Tokens)入门

发表于 2019-02-20 | 分类于 Java

简介

官网:https://jwt.io/

  • JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间作为JSON对象安全地传输信息
  • JWT入门级别原理(推荐优先读):http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

基本使用

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.7.0</version>
</dependency>

实现参考:

  • https://www.cnblogs.com/yueguanguanyun/p/9055049.html
  • https://www.cnblogs.com/jimisun/p/9480886.html
  • https://www.cnblogs.com/jimisun/p/9482439.html

Android中主题(Theme)和样式(Style)使用

发表于 2019-02-15 | 分类于 移动开发

Theme和Style说明

  • Theme是全局的设计风格。style是局部的设计风格
  • Theme是一套UI控件和Activity的样式。可以给Application 和 activity 设置主题。来设置显示界面的样式
  • style是针对view来说的,比如 TextView,EditText这些,而Theme必须针对整个activity或者 整个application,你必须在AndroidManifest.xml中 的或者中定义
  • Style的xml文件要求:
1
2
3
4
5
6
1. 他的根节点必须 是<resources>
2. 给<style> 增加一个全局唯一的名字,也可以选择增加一个parent父类属性
3. 使用时只要在写我们的view时,加入style标签就可以了
<TextView
style="@style/CodeFont"
android:text="@string/hello" />

Theme设置

Theme设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jude.test.education" >

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
<!--这里设置的是整个APP的主题,所有activiy和view都会默认为这个主题-->
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
<!--这里设置的是这个Activity的主题,Activity所有view都会默认为这个主题-->
android:theme="@style/AppTheme"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

Theme继承并重写

在value->style里定义主题。可以继承并重写属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 兼容主题 深色主题 activity背景默认黑色,字体默认白色-->
<style name="AppTheme" parent="Theme.AppCompat">
</style>

<!-- 兼容主题 浅色主题 activity背景默认白色 字体默认黑色 -->
<style name="AppTheme2" parent="Theme.AppCompat.Light">
</style>

<!-- 兼容主题 深色主题 无Actionbar-->
<style name="AppTheme3" parent="Theme.AppCompat.NoActionBar">
</style>

<!-- 兼容主题 浅色主题 无Actionbar-->
<style name="AppTheme4" parent="Theme.AppCompat.Light.NoActionBar">
</style>

代码中设置Activity主题

  • Activity 是 ContextThemeWrapper的子类。而ContextThemeWrapper一个很重要的属性就是Theme
  • 实例化一个View必须要 new View(Context context) 。因为View需要把Attributes交给Context的Theme来确定一堆属性(在一个叫TypedArray的容器里)

Theme设置注意事项

  • 如果使用 android.support.v7.app.ActionBarActivity 就必须要用兼容主题Theme.AppCompat。
1
ActionBarActivity 的存在就是为了兼容低API。让他们用上高API的东西。比如Toolbar
  • Holo主题是Android4.0开始谷歌极力推行的Android Design的主题
1
2
<style name="AppTheme5" parent="android:Theme.Holo">
</style>
  • Android5.0谷歌又推出了Material Design来取代Android Design
1
2
 <style name="AppTheme5" parent="android:Theme.Material">
</style>

Theme来源

在Android Studio中书写主题时都会有自动提示

  1. 来自Android系统自带的。自带的主题要加上“android:”,如:android:Theme.Black
  2. 来自兼容包的(比如v7兼容包)。使用v7兼容包中的主题不需要前缀,直接:Theme.AppCompat
  3. 自己写一个主题

Theme种类

  • 所有能应用于应用程序主题都是以“Theme.”开头
  • 在v7中有很多以“Base”开头的主题,是一些父主题,不建议直接使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
系统自带主题:
API 1:
android:Theme 根主题
android:Theme.Black 背景黑色
android:Theme.Light 背景白色
android:Theme.Wallpaper 以桌面墙纸为背景
android:Theme.Translucent 透明背景
android:Theme.Panel 平板风格
android:Theme.Dialog 对话框风格

API 11:
android:Theme.Holo Holo根主题
android:Theme.Holo.Black Holo黑主题
android:Theme.Holo.Light Holo白主题

API 14:
Theme.DeviceDefault 设备默认根主题
Theme.DeviceDefault.Black 设备默认黑主题
Theme.DeviceDefault.Light 设备默认白主题

API 21: (网上常说的 Android Material Design 就是要用这种主题)
Theme.Material Material根主题
Theme.Material.Light Material白主题

================================================================
兼容包v7中带的主题:
Theme.AppCompat 兼容主题的根主题
Theme.AppCompat.Black 兼容主题的黑色主题
Theme.AppCompat.Light 兼容主题的白色主题

...

Theme风格种类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Black 黑色风格
Light 光明风格
Dark 黑暗风格
DayNight 白昼风格
Wallpaper 墙纸为背景
Translucent 透明背景
Panel 平板风格
Dialog 对话框风格
NoTitleBar 没有TitleBar
NoActionBar 没有ActionBar
Fullscreen 全屏风格
MinWidth 对话框或者ActionBar的宽度根据内容变化,而不是充满全屏
WhenLarge 对话框充满全屏
TranslucentDecor 半透明风格
NoDisplay 不显示,也就是隐藏了
WithActionBar 在旧版主题上显示ActionBar

每个主题中定义item分类

https://yq.aliyun.com/articles/72108

颜色、字体、按钮、list、window、Dialog、AlertDialog、Panel、滚动条、文字选中(Text Selection)、Widget样式、Preference样式、search控件样式、ActionBar样式、其他样式

SVN迁移

发表于 2019-02-14 | 分类于 工具

SVN_Root为所有SVN操作根目录,包括所有的软件、资源库等

  • Soft:为搭建SVN环境相关的软件
  • Subversion:为SVN服务端软件安装目录
  • SVN_BAK:为SVN备份文件
  • repos:SVN仓库的根目录
  • ReadMe:当前目录说明文件

所有命令行操作需要管理员权限

服务启动:
svnserve.exe -d -r D:\SVN_Root\repos

SVN还原
svnadmin load D:\SVN_Root\repos\repos < D:\repos.dump

注册为系统服务
sc create svn binpath= ““D:\SVN_Root\Subversion\bin\svnserve.exe” --service -r D:\SVN_Root\repos” displayname= “Subversion Server” depend= Tcpip start= auto

项目更换服务器,需迁移SVN,现记录过程。

Subversion简介

  1. Subversion(简称SVN)是一款功能强大的开源版本控制工具,支持Linux和Windows平台。
  2. SVN可以有两个访问方式,一种是独立服务器直接访问,即利用svnserve命令启动服务,通过svn://yourdomain.com/project进行访问和操作。另一种结合apache,利用HTTP协议,通过http://yourdomain.com/svn/project进行访问及各类操作。如果服务器需要在互联网上共享,一般选择后一种方式。
  3. 通常情况下,如果选择SVN Server和Apache HTTP Server各自独立安装,配置起来会比较繁琐。

软件下载
服务器:Subversion v1.7 http://sourceforge.net/projects/win32svn/
客户端:Tortoisesvn V1.7 http://tortoisesvn.net/downloads.html

结构说明
D:/svnroot
├─project1
│ ├─conf
│ ├─dav
│ ├─db
│ │ ├─revprops
│ │ ├─revs
│ │ └─transactions
│ ├─hooks
│ └─locks
└─project2
├─conf
├─dav
├─db
│ ├─revprops
│ ├─revs
│ └─transactions
├─hooks
└─locks
其中:svnroot文件夹为存放所有仓库,也是服务启动的时候需指定的目录,下面的各项为项目目录

启动服务
启动独立服务方式
svnserve –d –r e:/svn_repository/
访问方法:svn://localhost/dev,或file:///3:/svn_repository/dev
启动apache方式
cd D:/Program Files/CollabNet Subversion Server/httpd/bin
httpd.exe
访问方法:http://localhost/svn/dev/

本项目所使用过程
所有命令行操作需要管理员权限
1.服务启动:
svnserve.exe -d -r D:\SVN_Root\repos
2.SVN备份(从源服务器备份,如:192.168.11.121):
A:svnadmin dump d:\svn\repos\project1> dump.dump >D:\repos.dump .dump后缀不能丢
B:备份d:\svn\repos\project1下conf目录
3.SVN还原(拷贝.dump文件到目的服务器,如:192.168.7.116):
A:svnadmin create D:\SVN_Root\repos\project1
B:svnadmin load D:\SVN_Root\repos\project1 < D:\repos.dump
C:拷贝2.B中备份的conf文件夹覆盖D:\SVN_Root\repos\project1下conf文件
4.注册为系统服务
sc create svn binpath= ““D:\SVN_Root\Subversion\bin\svnserve.exe” --service -r D:\SVN_Root\repos” displayname= “Subversion Server” depend= Tcpip start= auto

荐读:
svnadmin命令:
http://blog.csdn.net/wzq9706/article/details/7319728
http://www.ityen.com/archives/529
svn命令:http://blog.sina.com.cn/s/blog_963453200101eiuq.html,svn命令也可通过Tortoisesvn客户端操作代替

MongoDB集群搭建

发表于 2019-02-14 | 分类于 数据库

##集群环境:三台服务器

server1:10.62.0.128主;server2:10.62.0.135从;server3:10.62.0.159从

每一台分为6个片:shard1~shard6端口为47017,47018,47019,47020,47021,47022;每一片建三个副本集;配置服务器端口号:37017;路由服务器端口号:30000;

(1).解压安装文件

[gsunis@gsunis Desktop]$ tar zxvf mongodb-linux-x86_64-3.0.6.tgz

(2).将mongoDB文件移动到/home/gsunis/mongodb目录下

[root@gsunis Desktop]# mv mongodb-linux-x86_64-3.0.6 /home/gsunis/mongodb

(3).数据存储目录

[root@gsunis bin]# mkdir -p /home/gsunis/data/db

(4).启动mongod服务

[root@gsunis Desktop]# cd /home/gsunis/mongodb/bin
[root@gsunis bin]# ./mongod --port 27017 --dbpath=/home/gsunis/data/db

(5).启动mongo客户端

打开新的Terminal
[gsunis@gsunis Desktop]$ su 
查看mongod服务启动情况
[root@gsunis Desktop]# netstat -ntpl | grep 27017

[root@gsunis Desktop]# cd /home/gsunis/mongodb/bin/
[root@gsunis bin]# ./mongo

###正常关闭mongoDB服务

./mongo
use admin
db.shutdownServer() 或者ps -ef|grep mongodb  kill -2 pid

##以上是简单的安装mongodb,下面是开始建立集群,分片和建立副本集

###创建目录
mkdir -p /data/conf
mkdir -p /data/data1
mkdir -p /data/data2
mkdir -p /data/data3
mkdir -p /data/data4
mkdir -p /data/data5
mkdir -p /data/data6

(6).编辑mongo配置文件

sudo vi conf.cnf

//conf.cnf   
port=37017  
dbpath=/home/gsunis/data/conf  
logappend = true  
fork=true  
logpath=/home/gsunis/data/conf/mongodb.log  
nojournal=false  
configsvr=true  
profile=1 

sudo vi db1.cnf

//db1.cnf  
replSet=shard1  
port=47017  
dbpath=/home/gsunis/data/data1  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data1/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

sudo vi db2.cnf

//db2.cnf  
replSet=shard2   
port=47018  
dbpath=/home/gsunis/data/data2  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data2/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

sudo vi db3.cnf

//db3.cnf  
replSet=shard3  
port=47019  
dbpath=/home/gsunis/data/data3  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data3/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

sudo vi db4.cnf

//db4.cnf  
replSet=shard4   
port=47020  
dbpath=/home/gsunis/data/data4  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data4/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

sudo vi db5.cnf

//db5.cnf  
replSet=shard5   
port=47021  
dbpath=/home/gsunis/data/data5  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data5/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

sudo vi db6.cnf

//db6.cnf  
replSet=shard6   
port=47022  
dbpath=/home/gsunis/data/data6  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data6/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

(7).编写启动mongo服务的脚本

sudo vi mg.sh

#!/bin/bash  
instance=$1  
action=$2  
case "$action" in  
   'start')  
/home/gsunis/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf ;;  
   'stop')  
/home/gsunis/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf --shutdown;;  
   'restart')  
/home/gsunis/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf --shutdown  
/home/gsunis/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf;;  
esac  

(8).启动mongo服务脚本

sudo vi start.sh

#!/bin/bash 
rm /data/conf/*.lock
rm /data/data1/*.lock	
rm /data/data2/*.lock
rm /data/data3/*.lock
rm /data/data4/*.lock
rm /data/data5/*.lock
rm /data/data6/*.lock
/home/gsunis/data/mg.sh db1 start  
/home/gsunis/data/mg.sh db2 start  
/home/gsunis/data/mg.sh db3 start  
/home/gsunis/data/mg.sh db4 start  
/home/gsunis/data/mg.sh db5 start
/home/gsunis/data/mg.sh db6 start  

sudo vi stop.sh

#!/bin/bash 
/home/gsunis/data/mg.sh conf stop 
/home/gsunis/data/mg.sh db1 stop  
/home/gsunis/data/mg.sh db2 stop  
/home/gsunis/data/mg.sh db3 stop  
/home/gsunis/data/mg.sh db4 stop  
/home/gsunis/data/mg.sh db5 stop
/home/gsunis/data/mg.sh db6 stop  

###准备工作做好,先启动配置服务器(先启动主,依次启动两从机)
/home/gsunis/data/mg.sh conf start
###再启动路由服务器(先启动主,依次启动两从机)
/home/gsunis/mongodb/bin/mongos --configdb 10.62.0.128:37017,10.62.0.135:37017,10.62.0.159:37017 --port 30000 --chunkSize 1 --logpath /home/gsunis/data/mongos1.log --logappend --fork
###最后启动mongod(先启动主,依次启动两从机)
/home/gsunis/mongodb/data/start.sh

(9).shard服务器副本集的建立(只需要在主机上做即可,两从机会自动复制)

./mongo --port 47017

config = {_id: 'shard1', members: [
 {_id: 0, host: '10.62.0.128:47017'},
 {_id: 1, host: '10.62.0.135:47017'},
 {_id: 2, host: '10.62.0.159:47017'}]
 }
rs.initiate(config)

Ctrl + C 退出
  • rs.add({"_id":2,“host”:“10.62.0.135:47017”}) #在线增加复制集

./mongo --port 47018

config = {_id: 'shard2', members: [
 {_id: 0, host: '10.62.0.128:47018'},
 {_id: 1, host: '10.62.0.135:47018'},
 {_id: 2, host: '10.62.0.159:47018'}]
 }
rs.initiate(config)


./mongo --port 47019

config = {_id: 'shard3', members: [
 {_id: 0, host: '10.62.0.128:47019'},
 {_id: 1, host: '10.62.0.135:47019'},
 {_id: 2, host: '10.62.0.159:47019'}]
 }
rs.initiate(config)


./mongo --port 47020

config = {_id: 'shard4', members: [
 {_id: 0, host: '10.62.0.128:47020'},
 {_id: 1, host: '10.62.0.135:47020'},
 {_id: 2, host: '10.62.0.159:47020'}]
 }
rs.initiate(config)

./mongo --port 47021

config = {_id: 'shard5', members: [
 {_id: 0, host: '10.62.0.128:47021'},
 {_id: 1, host: '10.62.0.135:47021'},
 {_id: 2, host: '10.62.0.159:47021'}]
 }
rs.initiate(config)


./mongo --port 47022

config = {_id: 'shard6', members: [
 {_id: 0, host: '10.62.0.128:47022'},
 {_id: 1, host: '10.62.0.135:47022'},
 {_id: 2, host: '10.62.0.159:47022'}]
 }
rs.initiate(config)

配置sharding:登录到mongos,添加shard节点

./mongo --port 30000

use admin

db.runCommand({addshard:"shard1/10.62.0.128:47017,10.62.0.159:47017,10.62.0.135:47017"});
db.runCommand({addshard:"shard2/10.62.0.128:47018,10.62.0.159:47018,10.62.0.135:47018"});
db.runCommand({addshard:"shard3/10.62.0.128:47019,10.62.0.159:47019,10.62.0.135:47019"});
db.runCommand({addshard:"shard4/10.62.0.128:47020,10.62.0.159:47020,10.62.0.135:47020"});
db.runCommand({addshard:"shard5/10.62.0.128:47021,10.62.0.159:47021,10.62.0.135:47021"});
db.runCommand({addshard:"shard6/10.62.0.128:47022,10.62.0.159:47022,10.62.0.135:47022"});


use config

db.shards.find()

启动路由服务出错

错误:

时钟不同步,导致无法启动路由服务

解决方法:

  • (1).关闭所有mongo相关服务
  • (2).先启配置服务 Config Server
  • (3).启动路由服务 mongos
  • (4).最后启动所有mongod服务 mongod
    ###远程copy
    scp /home/gsunis/Tools/mongodb-linux-x86_64-3.0.6.tgz gsunis@10.62.0.135:/home/gsunis/

MongoDB安装

发表于 2019-02-14 | 分类于 数据库

(1).解压安装文件

[gsunis@gsunis Desktop]$ tar zxvf mongodb-linux-x86_64-3.0.6.tgz

(2).将mongoDB文件移动到/usr/local/mongodb目录下

[root@gsunis Desktop]# mv mongodb-linux-x86_64-3.0.6 /usr/local/mongodb
export PATH=/usr/local/mongodb/bin:$PATH

(3).数据存储目录

[root@gsunis bin]# mkdir -p /home/gsunis/data/db
mkdir -p /data/conf 
mkdir -p /data/data1  
mkdir -p /data/data2  
mkdir -p /data/data3  
mkdir -p /data/data4  
mkdir -p /data/data5  
mkdir -p /data/data6 

(4).启动mongod服务

[root@gsunis Desktop]# cd /usr/local/mongodb/bin
[root@gsunis bin]# ./mongod --port 27017 --dbpath=/home/gsunis/data/db

(5).启动mongo客户端

打开新的Terminal
[gsunis@gsunis Desktop]$ su 
查看mongod服务启动情况
[root@gsunis Desktop]# netstat -ntpl | grep 27017

[root@gsunis Desktop]# cd /usr/local/mongodb/bin/
[root@gsunis bin]# ./mongo

(6).编辑mongo配置文件

sudo vi conf.cnf

//conf.cnf  
rest=true  
port=37017  
dbpath=/home/gsunis/data/conf  
logappend = true  
fork=true  
logpath=/home/gsunis/data/conf/mongodb.log  
nojournal=false  
configsvr=true  
profile=1 

sudo vi db1.cnf

//db1.cnf  
replSet=shard1  
rest=true  
port=47017  
dbpath=/home/gsunis/data/data1  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data1/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

sudo vi db2.cnf

//db2.cnf  
replSet=shard2  
rest=true  
port=47018  
dbpath=/home/gsunis/data/data2  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data2/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

sudo vi db3.cnf

//db3.cnf  
replSet=shard3  
rest=true  
port=47019  
dbpath=/home/gsunis/data/data3  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data3/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

sudo vi db4.cnf

//db4.cnf  
replSet=shard4  
rest=true  
port=47020  
dbpath=/home/gsunis/data/data4  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data4/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

sudo vi db5.cnf

//db5.cnf  
replSet=shard5  
rest=true  
port=47021  
dbpath=/home/gsunis/data/data5  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data5/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

sudo vi db6.cnf

//db6.cnf  
replSet=shard6  
rest=true  
port=47022  
dbpath=/home/gsunis/data/data6  
logappend = true  
fork=true  
logpath=/home/gsunis/data/data6/mongodb.log  
nojournal=false  
shardsvr=true  
profile=1  

(7).编写启动mongo服务的脚本

sudo vi mg.sh

#!/bin/bash  
instance=$1  
action=$2  
case "$action" in  
   'start')  
/usr/local/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf ;;  
   'stop')  
/usr/local/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf --shutdown;;  
   'restart')  
/usr/local/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf --shutdown  
/usr/local/mongodb/bin/mongod -f /home/gsunis/data/"$instance".cnf;;  
esac  

(8).启动docker实例的mongo服务脚本

sudo vi start.sh

#!/bin/bash 
rm /data/conf/*.lock
rm /data/data1/*.lock	
rm /data/data2/*.lock
rm /data/data3/*.lock
rm /data/data4/*.lock
rm /data/data5/*.lock
rm /data/data6/*.lock
/home/gsunis/data/mg.sh conf start 
/home/gsunis/data/mg.sh db1 start  
/home/gsunis/data/mg.sh db2 start  
/home/gsunis/data/mg.sh db3 start  
/home/gsunis/data/mg.sh db4 start  
/home/gsunis/data/mg.sh db5 start
/home/gsunis/data/mg.sh db6 start  

sudo vi start.sh

#!/bin/bash 
rm /data/conf/*.lock
rm /data/data1/*.lock	
rm /data/data2/*.lock
rm /data/data3/*.lock
rm /data/data4/*.lock
rm /data/data5/*.lock
rm /data/data6/*.lock
/home/gsunis/data/mg.sh conf stop 
/home/gsunis/data/mg.sh db1 stop  
/home/gsunis/data/mg.sh db2 stop  
/home/gsunis/data/mg.sh db3 stop  
/home/gsunis/data/mg.sh db4 stop  
/home/gsunis/data/mg.sh db5 stop
/home/gsunis/data/mg.sh db6 stop  

正常关闭mongoDB服务

./mongo
use admin
db.shutdownServer()

(9).shard服务器副本集的建立

./mongo --port 47017

config = {_id: 'shard1', members: [
 {_id: 0, host: '10.62.0.128:47017'},
 {_id: 1, host: '10.62.0.159:47017'}]
 }
rs.initiate(config)

Ctrl + C 退出

./mongo --port 47018

config = {_id: 'shard2', members: [
 {_id: 0, host: '10.62.0.128:47018'},
 {_id: 1, host: '10.62.0.159:47018'}]
 }
rs.initiate(config)


./mongo --port 47019

config = {_id: 'shard3', members: [
 {_id: 0, host: '10.62.0.128:47019'},
 {_id: 1, host: '10.62.0.159:47019'}]
 }
rs.initiate(config)


./mongo --port 47020

config = {_id: 'shard4', members: [
 {_id: 0, host: '10.62.0.128:47020'},
 {_id: 1, host: '10.62.0.159:47020'}]
 }
rs.initiate(config)

./mongo --port 47021

config = {_id: 'shard5', members: [
 {_id: 0, host: '10.62.0.128:47021'},
 {_id: 1, host: '10.62.0.159:47021'}]
 }
rs.initiate(config)


./mongo --port 47022

config = {_id: 'shard6', members: [
 {_id: 0, host: '10.62.0.128:47022'},
 {_id: 1, host: '10.62.0.159:47022'}]
 }
rs.initiate(config)
1…345…50
行锋

行锋

496 日志
15 分类
74 标签
GitHub E-Mail
自古写字楼如青楼,不许楼里见白头
© 2015 — 2019 行锋
博客全站共229.9k字