La empresa actual utiliza el dubbo interno de Ali, que es EDAS, que utiliza el propio servicio EDAS de Ali. Si eres un viejo fanático que ha usado dubbo, debes saber que zookeeper, zookeeper está más preocupado por la aplicación de big data y comunicación RPC. Tanto si ha utilizado zookeeper como si no, esta vez presento principalmente el despliegue de zookeeper y clúster. Esto solo puede entenderse en profundidad solo bajo el funcionamiento real.
Código fuente: https://github.com/limingios/netFuture/ [zookeeper]
(1) Introducción al cuidador del zoológico
-
historia
Zookeeper se originó en un grupo de investigación en Yahoo Research Institute. En ese momento, los investigadores descubrieron que muchos sistemas grandes dentro de Yahoo dependen básicamente de un sistema similar para la coordinación distribuida, pero estos sistemas a menudo tienen problemas distribuidos de un solo punto. Por lo tanto, los desarrolladores de Yahoo intentaron desarrollar un marco de coordinación distribuido general sin un solo punto de problema, de modo que los desarrolladores puedan centrarse en procesar la lógica empresarial.
De hecho, hay una anécdota interesante sobre el nombre del proyecto "ZooKeeper". En la etapa inicial del proyecto, considerando que muchos proyectos internos llevaban nombres de animales (como el famoso proyecto Pig), los ingenieros de Yahoo esperaban darle a este proyecto un nombre de animal. Raghu Ramakrishnan, el científico jefe del Instituto en ese momento, dijo en broma: "¡Si esto continúa, nos convertiremos en un zoológico!" Tan pronto como se dijo esto, todos dijeron que llamarían al cuidador del zoológico uno por uno debido a la distribución. de los nombres de los animales. Junte los componentes, todo el sistema distribuido de Yahoo parece un gran zoológico, y Zookeeper se utiliza para coordinar el entorno distribuido uno por uno, por lo que nació el nombre Zookeeper. -
Por que el guardián del zoológico es atractivo
En la década de 1960, se inventó el mainframe y se convirtió en la corriente principal del mundo en virtud de sus capacidades de procesamiento de E / S y supercomputación, así como de estabilidad y seguridad. Pero los mainframes también tienen algunos problemas fatales, como una construcción costosa, operaciones complicadas y problemas de un solo punto. En particular, el costo de capacitar talentos para mainframes es muy alto. Con la aparición de estos problemas, sigue afectando el desarrollo de mainframes. Por otro lado, con la mejora continua del rendimiento de las PC y la popularización de las redes, todo el mundo ha recurrido al uso de miniordenadores y servidores de PC ordinarios para construir sistemas informáticos distribuidos para reducir costos. Después de eso, la distribución se ha vuelto cada vez más popular.
- Sitio web oficial de Zookeeper
Enlace de descarga: https://www-eu.apache.org/dist/zookeeper/
Dirección de origen: https://github.com/apache/zookeeper
(2) Despliegue de clúster
Hay dos tipos de clústeres, uno es un clúster distribuido y el otro es un clúster pseudodistribuido.
Distribuido: cada aplicación está en un host independiente y los puertos son consistentes.
Pseudodistribuido: varias aplicaciones están en un host y los puertos están diferenciados. La pseudodistribución es poco común en el entorno de producción real.
Los clústeres pseudodistribuidos son más difíciles de operar.instalación de mac vgarant: https://idig8.com/2018/07/29/docker-zhongji-07/
instalación de ventana vgarant https://idig8.com/2018/07/29/docker-zhongji-08/
Tipo de sistema | dirección IP | Rol de nodo | UPC | Memoria | Nombre de host |
---|---|---|---|---|---|
Centos7 | 192.168.69.100 | Pseudodistribuido | 2 | 2G | guardián-virtua |
Centos7 | 192.168.69.101 | Verdadero líder distribuido | 2 | 2G | cuidador-líder del zoológico |
Centos7 | 192.168.69.102 | Verdadero distribuido-subordinado 1 | 2 | 2G | zookeeper-Follower1 |
Centos7 | 192.168.69.103 | Verdadero distribuido-subordinado 2 | 2 | 2G | zookeeper-Follower2 |
El truquito de src, para que haya color, lo he estado descuidando antes y me duelen los ojos cuando lo miro, ahora el color es mucho mejor.
- (2.1) Configuración de pseudoambiente
Sigo usando vagrant Como estoy familiarizado con vagrant, apenas he creado una máquina virtual manualmente.
(2.1.1) Configuración básica
su #密码 vagrant cd ~ vi /etc/ssh/sshd_config sudo systemctl restart sshd
vi /etc/resolv.conf
Establecer en 8.8.8.8
reinicio de la red de servicio
![](https://upload-images.jianshu.io/upload_images/11223715-78a8109c41a094e6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-2aab7202b523bc3f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-1916bbc2f18c3145.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>(2.1.2)jdk安装
>脚本在我的源码里面
``` bash
vi pro.sh
sh pro.sh
(2.1.3) La
herramienta de descarga y descarga de Zookeeper debe recordar usar la última versión que se ha lanzado a 3.5.4, todavía uso 3.4.10
wget https://www-eu.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
(2.1.4) Descomprimir zookeeper
tar zxvf zookeeper-3.4.10.tar.gz
(2.1.5) Ingrese al directorio conf en zk y copie 3 archivos
cd /root/zookeeper-3.4.10/conf cp zoo_sample.cfg zoo1.cfg cp zoo_sample.cfg zoo2.cfg cp zoo_sample.cfg zoo3.cfg
(2.1.6) Edite estos 3 archivos zoo1.cfg, zoo2.cfg, zoo3.cfg
(2.1.6.1) Editar zoo1.cfg
vi zoo1.cfg
dataDir = / apps / servers / data / d_1
dataLogDir = / apps / servers / logs / logs_1
clientPort = 2181# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/apps/servers/data/d_1 dataLogDir=/apps/servers/logs/logs_1 # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 server.1=localhost:2187:2887 server.2=localhost:2188:2888 server.3=localhost:2189:2889
(2.1.6.2) Editar zoo2.cfg
vi zoo2.cfg
dataDir = / apps / servers / data / d_2
dataLogDir = / apps / servers / logs / logs_2
clientPort = 2182# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/apps/servers/data/d_2 dataLogDir=/apps/servers/logs/logs_2 # the port at which the clients will connect clientPort=2182 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 server.1=localhost:2187:2887 server.2=localhost:2188:2888 server.3=localhost:2189:2889
(2.1.6.3) Editar zoo3.cfg
vi zoo3.cfg
dataDir = / apps / servers / data / d_3
dataLogDir = / apps / servers / logs / logs_3
clientPort = 2183# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/apps/servers/data/d_3 dataLogDir=/apps/servers/logs/logs_3 # the port at which the clients will connect clientPort=2183 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 server.1=localhost:2187:2887 server.2=localhost:2188:2888 server.3=localhost:2189:2889
(2.1.7) Crear directorio de datos y directorio de registro
mkdir -p /apps/servers/data/d_1 mkdir -p /apps/servers/data/d_2 mkdir -p /apps/servers/data/d_3
mkdir -p / apps / servers / logs / logs_1
mkdir -p / apps / servers / logs / logs_2
mkdir -p / apps / servers / logs / logs_3
echo "1"> / apps / servers / data / d_1 / myid
echo "2"> / apps / servers / data / d_2 / myid
echo "3"> / apps / servers / data / d_3 / myid
![](https://upload-images.jianshu.io/upload_images/11223715-29358fa9e009905c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> (2.1.8)进入bin目录下输入命令 分别进行启动
``` bash
cd /root/zookeeper-3.4.10/bin
sh zkServer.sh start ../conf/zoo1.cfg
sh zkServer.sh start ../conf/zoo2.cfg
sh zkServer.sh start ../conf/zoo3.cfg
(2.1.9) Ingrese cada uno para ver el efecto
source /etc/profile sh zkCli.sh -server localhost:2181 sh zkCli.sh -server localhost:2182 sh zkCli.sh -server localhost:2183
La pseudodistribución se completa realmente de esta manera. El foco todavía está distribuido y mira hacia abajo.
- (1.2) Configuración de entorno distribuido
(1.2.1) Configuración básica (las tres máquinas deben configurarse)
su #密码 vagrant cd ~ vi /etc/ssh/sshd_config sudo systemctl restart sshd
vi /etc/resolv.conf
Establecer en 8.8.8.8
reinicio de la red de servicio
![](https://upload-images.jianshu.io/upload_images/11223715-af39780dc5b88a2c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-1006580435e435f3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-514cba97d35d79e3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-42238d619aa86169.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-099a2ba509e81d91.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-008debaab296be6f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-fc58d43a8ce53bf2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-faa0c439160805be.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-d036b005acb8483f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>(1.2.2)jdk安装(三台机器都需要设置)
>脚本在我的源码里面
``` bash
vi pro.sh
sh pro.sh
(1.2.3) Descarga de Zookeeper (es necesario configurar las tres máquinas) La
herramienta de descarga debe recordar utilizar la última versión que se ha lanzado a 3.5.4. Todavía uso 3.4.10.
¿Por qué hay tres? Porque Zookeeper le gustan los números impares y no le gustan los números pares.
wget https://www-eu.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
(1.2.4) Descomprimir zookeeper
tar zxvf zookeeper-3.4.10.tar.gz
(1.2.4) Configure el archivo cfg (las tres máquinas deben configurarse)
cd ~
cd zookeeper-3.4.10/
cd conf
cp zoo_sample.cfg zoo.cfg
(1.2.5) Configure el archivo cfg. De hecho, los archivos de configuración de las 3 máquinas son los mismos. No repetiré la escritura de cfg, solo tomaré una captura de pantalla.
vi zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
dataLogDir=/tmp/zookeeper/logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.0=192.168.69.101:2888:3888
server.1=192.168.69.102:2888:3888
server.2=192.168.69.103:2888:3888
(1.2.6) La configuración de myid
debe configurarse en el directorio sobre dataDir = / tmp / zookeeper.cd / cd tmp mkdir zookeeper cd zookeeper
(1.2.6.1) 192.168.69.101 configurar myid
echo '0'>myid cat myid
(1.2.6.2) 192.168.69.102 configurar myid
echo '1'>myid cat myid
(1.2.6.3) 192.168.69.103 configurar myid
echo '2'>myid cat myid
Inicie el comando para ejecutar zookeeper en 3 máquinas virtuales
cd ~/zookeeper-3.4.10/bin
sh zkServer.sh start
#### (3) Peinado conceptual
- (3.1) Configuración de Zoo.cfg
parámetro | significado |
---|---|
tickTime | 2000 |
syncLimit | El tiempo de comunicación más largo entre el líder y el seguidor no puede exceder initLimt * ticktime |
initLimt | Acepte el tiempo de espera más largo initLimt * ticktime inicializado por el enlace del cliente zk |
dataDir | Directorio de datos |
dataLogDir | Archivo de registro |
clientPort | Número de puerto del servidor de enlace de cliente Servidor.A = B: C: DA: el servidor de números B IP de servicio C representa el puerto de comunicación líder y seguidor D puerto líder alternativo |
- (3.2) Rol
Líder:
Como nodo principal de todo el clúster de ZooKeeper, el líder es responsable de responder a todas las solicitudes de cambios de estado de ZooKeeper. Ordenará y numerará cada solicitud de actualización de estado para garantizar que las operaciones de escritura y FIFO del procesamiento de mensajes internos de todo el clúster vayan al líder.
Seguidor:
La lógica de Follower es relativamente simple. Además de responder a las solicitudes de lectura en este servidor, el seguidor también procesa la propuesta del líder y la envía localmente cuando el líder envía la propuesta. Otro dato a destacar es que el líder y el seguidor constituyen el quórum del clúster ZooKeeper, es decir, solo ellos participan en la elección del nuevo líder y responden a la propuesta del líder.
Observador:
Si la carga de lectura del clúster de ZooKeeper es muy alta o hay muchos clientes en las salas de computadoras, puede configurar algunos servidores de observadores para mejorar el rendimiento de lectura. El observador y el seguidor son similares, con algunas diferencias menores: primero, el observador no es un quórum, es decir, no participa en las elecciones y no responde a las propuestas; segundo, el observador no necesita mantener las transacciones en el disco. el observador se reinicia, el nombre completo debe resincronizarse desde el espacio líder.
- (3.3) Funciones de Zookeeper
Zookeeper está compuesto por múltiples servidores
1. Clúster un líder, múltiples seguidores
2. Cada servidor guarda una copia de los datos
3. Los datos globales son consistentes y se distribuyen para los seguidores de lectura, las actualizaciones de escritura son enviadas por el líder y actualizadas por el líder Las solicitudes son se realizan en orden, y las solicitudes de actualización del mismo cliente se ejecutan en el orden de envío de la atomicidad.
4. Una actualización de datos tiene éxito o falla. La vista de datos globalmente única.
5. La vista de datos es siempre la misma independientemente del servidor el cliente está conectado. En tiempo real constante, dentro de un cierto rango de eventos, el cliente puede leer los datos más recientes
PD: Esta vez hablo principalmente sobre el principio del guardián del zoológico y la implementación del clúster. No presenté los detalles con demasiados detalles. La próxima vez, hablaré sobre el uso del guardián del zoológico.