Construcción del entorno ZooKeeper
1. Introducción a ZooKeeper
En el campo distribuido, un componente indispensable es ZooKeeper.
ZooKeeper es un marco de gestión y coordinación de datos distribuidos de alta disponibilidad, y puede garantizar la coherencia de los datos en un entorno distribuido.
ZooKeeper fue creado por Yahoo y es una implementación de código abierto de Google Chubby. La coherencia de Chubby se basa en el algoritmo Paxos, y ZK utiliza una variante del protocolo Paxos, ZAB (protocolo de transmisión atómica de ZooKeeper, nombre completo: Protocolo de transmisión de mensajes atómicos de ZooKeeper).
Los principales escenarios de aplicación de ZooKeeper incluyen: publicación/suscripción de datos, equilibrio de carga, servicio de nombres, coordinación/notificación distribuida, gestión de clústeres, elección de maestro, bloqueos distribuidos, colas distribuidas, etc. Actualmente, Zookeeper se utiliza como componente central en cada vez más sistemas distribuidos (Hadoop, HBase, Storm, Kafka).
El servidor tiene dos roles principales: líder y seguidor.
-
Líder: responsable de la iniciación y resolución de votaciones, y actualización del estado del sistema;
-
Seguidor: Recibir solicitudes de clientes y devolver resultados al cliente, y participar en la votación en el proceso de elección;
Dato curioso sobre el nombre ZooKeeper . En la etapa inicial del proyecto, teniendo en cuenta que muchos proyectos internos tenían 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, bromeó: "¡Si esto continúa así, nos convertiremos en un zoológico!" Al juntar los componentes, todo el sistema distribuido de Yahoo parece un gran zoológico, y Zookeeper solo se usa para coordinar el entorno distribuido, y así nació el nombre Zookeeper.
2. Instalación de ZooKeeper
Hay dos formas de implementar ZooKeeper:
- Modo independiente (modo independiente): utilizado en el entorno de desarrollo, servidor único
- Modo clúster (modo multiservidor): utilizado en el entorno de producción, la cantidad de servidores es impar
¿Por qué se establece ZK en un número impar?
Zookeeper tiene una característica de este tipo: siempre que más de la mitad de las máquinas del clúster funcionen normalmente, todo el clúster está disponible para el mundo exterior. Es decir, si hay 2 servidores zookeeper, mientras 1 servidor se cuelgue, no se podrá usar todo el clúster de zookeeper, porque 1 no es más de la mitad, por lo que la tolerancia de error de 2 servidores zookeeper es 0; de manera similar , si hay 3 Cuelga uno de los zookeepers, y quedan 2 funcionando normalmente, más de la mitad de ellos, entonces la tolerancia de 3 zookeepers es 1; por lo mismo, puedes enumerar unos cuantos más: 2 -> 0; 3 -> 1; 4 -> 1 ; 5 -> 2; 6 -> 2 encontrará una regla, la tolerancia de 2n y 2n-1 es la misma, ambos son n-1, así que para ser más eficiente, ¿por qué agregar un cuidador de zoológico innecesario?
Se puede ver que la cantidad de servidores en el clúster ZK es al menos tres.
0. Preparaciones
Lista de requisitos:
-
SO: Ubuntu-18.04
Si necesita los pasos de instalación del sistema operativo, consulte: Instalación de máquina virtual (tutorial de nivel de niñera)
-
Guardián del zoológico 3.7.0
Dirección de descarga del sitio web oficial: https://zookeeper.apache.org/releases.html
-
JDK:JDK1.8
ZooKeeper se ejecuta en base a JVM. El ZK instalado en este artículo requiere la versión 1.8 de JDK y superior (JDK 8 LTS, JDK 11 LTS, JDK 12; las versiones de Java 9 y 10 no son compatibles)
Dirección de descarga del sitio web oficial: http://java.sun.com/javase/downloads/index.jsp
Para atender a los usuarios básicos, el software necesario se coloca en el disco de red de Baidu
链接:https://pan.baidu.com/s/1kjcuNNCY2FxYA5o7Z2tgkQ 提取码:nuli
Pasos oficiales de instalación:
1) Instalar JDK
2) Establecer el tamaño del montón de Java (tamaño de la pila de Java)
Este es un paso importante para evitar el intercambio de memoria que afecta el rendimiento de ZooKeeper. Para determinar el valor correcto, debe realizar una prueba de carga y asegurarse de estar muy por debajo del límite de uso que provoca el intercambio.
3) Instalar ZooKeeper
4) Cree un archivo de configuración, el nombre del archivo se puede elegir arbitrariamente, se recomienda colocar el archivo de configuración en el directorio conf de ZooKeeper y nombrarlo zoo.cfg, para que sea conveniente iniciar el servicio sin especificar el archivo de configuración .
Complete la siguiente configuración:
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper/
clientPort=2181
maxClientCnxns=60
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
Descripción de parámetros:
parámetro | valores predeterminados | ilustrar |
---|---|---|
marcaTiempo | 2000 | Tiempo de latido de la comunicación cliente-servidor El intervalo de tiempo para mantener los latidos entre los servidores de Zookeeper o entre clientes y servidores, es decir, se envía un latido cada tickTime. tickTime está en milisegundos. |
initLimit | 10 | Límite de tiempo de comunicación inicial líder-seguidor El número máximo de latidos (el número de tickTimes) que se puede tolerar durante la conexión inicial entre el servidor seguidor (F) y el servidor líder (L) en el clúster. |
límite de sincronización | 5 | Límite de tiempo de comunicación síncrona líder-seguidor El número máximo de latidos (el número de tickTimes) que se puede tolerar entre la solicitud y la respuesta entre el servidor seguidor y el servidor líder en el clúster. |
dirección de datos | /tmp/guardián del zoológico | El directorio de archivos de datos Zookeeper guarda el directorio de datos. De manera predeterminada, Zookeeper también guarda los archivos de registro para escribir datos en este directorio. |
puertocliente | 2181 | Puerto de conexión del cliente El puerto en el que el cliente se conecta al servidor de Zookeeper. Zookeeper escuchará este puerto y aceptará las solicitudes de acceso de los clientes. |
maxClientCnxns | 60 | Máximo de conexiones de cliente admitidas |
servidor.id=host:puerto:puerto | La información del clúster (número de servidor, dirección del servidor, puerto de comunicación LF, puerto de elección) se escribe en un formato especial Las reglas son las siguientes: server.N=YYY:A:B, donde N se utiliza para indicar un número de serie del servidor en el clúster, necesitamos crear un archivo en el directorio dataDir , el myid contenido del archivo es el número correspondiente N A es el número de puerto, que se utiliza para la comunicación de la máquina en el clúster (solo el líder escucha este puerto B es el número de puerto, que se usa para elegir al líder (todo Zookeeper lo escucha) este puerto) |
Para obtener más información sobre los parámetros, consulte: https://zookeeper.apache.org/doc/r3.7.0/zookeeperAdmin.html#sc_configuration
5) Crear archivo myid
myid
Cree un archivo en el directorio dataDir establecido en el paso anterior .
myid
El archivo
El tamaño de la ID está entre 1 y 255. Si las funciones extendidas están habilitadas, como los nodos TTL, la ID debe estar entre 1 y 254.
6) Crear archivo de identidad inicialinitialize
initialize
El archivo se encuentra en el directorio dataDir y se crea cuando se inicia un nuevo clúster.
7) Inicie el servicio ZooKeeper de la siguiente manera
$ java -cp zookeeper.jar:lib/*:conf org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.conf
1. Modo autónomo
El modo independiente es la primera forma para principiantes o usuarios con recursos limitados. Este artículo presenta principalmente la instalación en modo independiente de ZK.
Suponiendo que el nombre de usuario actual es xiaobai
(si su nombre de usuario no es xiaobai, puede tomar dos formas: una es crear un usuario xiaobai y la otra es modificar la configuración correspondiente según su nombre de usuario), combinado con la instalación oficial pasos, presionamos Instalar de la siguiente manera:
1) Instalar JDK
Si ya está instalado, omita
Convención:
Cargue o descargue el paquete de instalación requerido en el directorio de software en el directorio de inicio
~/soft
El directorio de instalación se encuentra en el directorio opt en el directorio de inicio
~/opt
Cargue jdk en el ~/soft
directorio, asegúrese de que el archivo se haya cargado, ingrese el comando ls ~/soft
para ingresar la verificación
Luego descomprima el archivo
mkdir ~/opt
tar -xvf ~/soft/jdk-8u261-linux-x64.tar.gz -C ~/opt
establecer conexión suave
cd ~/opt
ln -s jdk1.8.0_261/ jdk
Configure las variables de entorno y abra el archivo de configuración de bash
cd
vi .bashrc
Presione i
para ingresar al modo de inserción, agregue el siguiente código al final , luego presione para esc
salir de la edición, ingrese para :x
guardar
export JAVA_HOME=/home/xiaobai/opt/jdk
export PATH=$PATH:$JAVA_HOME/bin
Ingrese el siguiente comando para que la modificación surta efecto, puede usar el java
comando para verificar si la configuración es exitosa
source .bashrc
java
2) Instalar ZooKeeper
(1) Cargue el paquete de instalación de ZooKeeper descargado del disco de red de Baidu apache-zookeeper-3.7.0-bin.tar.gz
al ~/soft
directorio
Por supuesto, también puede copiar el enlace de descarga del sitio web oficial y usar el wget
comando para descargar.
Asegúrese de que el archivo se haya cargado, ingrese el comando ls ~/soft
para ingresar la verificación
(2) Descomprima el paquete de instalación de ZooKeeper en el ~/opt
directorio
tar -xvf ~/soft/apache-zookeeper-3.7.0-bin.tar.gz -C ~/opt
ls ~/opt/apache-zookeeper-3.7.0-bin
(3) Crear enlaces blandos
cd ~/opt
ln -s apache-zookeeper-3.7.0-bin zookeeper
- El directorio bin incluye scripts ejecutables, como el zkServer.sh, zkCli.sh de uso común
- El directorio conf contiene archivos de configuración
- El directorio docs contiene documentación relacionada.
- El directorio lib contiene paquetes jar relacionados
(4) Modificar el archivo de configuración -
cd ~/opt/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
El valor modificado dataDir
es/home/xiaobai/opt/zookeeper/tmp
Tenga en cuenta que para Xiaobai, si no desea usar el comando vi, puede usar
sudo gedit ~/opt/zookeeper/conf/zoo.cfg
el Bloc de notas para abrir un archivo similar a Windows para editar el archivo y manejar situaciones similares más adelante.El comando vi es fácil de usar : después de ingresar el archivo, ingrese la letra
i
para ingresar al modo de inserción => modifique el contenido del archivo a node1 => presione laEsc
tecla para ingresar al modo de línea de comando => ingrese:
al modo de línea inferior = > entrarx
owq
guardar y salir.Si no desea guardar el archivo después de la modificación, ingrese al modo de línea inferior y luego ingrese
q!
para ejecutar y salir sin guardar.
3) Configurar variables de entorno
vi ~/.bashrc
Agregue lo siguiente al final del archivo:
export ZOOKEEPER_HOME=/home/xiaobai/opt/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
Hacer que las variables de entorno surtan efecto:
source ~/.bashrc
4) Iniciar Guardián del Zoológico
zkServer.sh start
Ver progreso
Ingrese el comando para jps
ver si el inicio es exitoso
Ver el estado de
Introduzca un comando para zkServer.sh status
ver estado
5) Conexión del cliente
método de entrevista:
-
A través de las herramientas del cliente:
-
Herramienta de línea de comandos: zkCli.sh
-
Herramienta de interfaz: ZooInspector
Dirección de descarga: https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
También se puede descargar desde el disco de red de Baidu proporcionado anteriormente.
-
-
A través de la API de Java
Aquí hay una demostración simple con la herramienta de línea de comando zkCli.sh,
(1) Inicie el cliente
zkCli.sh -server localhost:2181
(2) Crear un nodo
create /test 888
create -s /test/lock 666
create -s /test/lock 666
(3) Ver nodos
ls /
ls -s /tset
ZooKeeper mantiene una jerarquía similar a un árbol. Los nodos en el árbol se denominan znodes. Cada znode guardará su propio contenido de datos y una serie de información de atributos. Cada Znode tiene un identificador de ruta único; cabe señalar que los datos del znode no pueden superar 1 MB.
El árbol de directorios de ZooKeeper se puede ver a través de la herramienta ZooInspector .
Puede ver información detallada del nodo a través de los comandos
ls -s path
A continuación, se incluye una breve explicación de la información anterior:
[lock0000000000, lock0000000001] //Consulte qué nodos hay en este directorio
cZxid = 0xd //ZXID creado, que indica el ID de la transacción cuando se creó el ZNode
ctime = Thu Dec 16 20:52:57 CST 2021 // Hora de creación, que indica la hora en que se creó el ZNode
mZxid = 0xd //ZXID modificado, indicando el ID de la transacción cuando se actualizó por última vez el ZNode
mtime = Thu Dec 16 20:52:57 CST 2021 //Modified Time, que indica la última vez que se actualizó el nodo
pZxid = 0xf //Indica el ID de la transacción cuando se modificó por última vez la lista de nodos secundarios de este nodo. Tenga en cuenta que pZxid solo se cambiará si se cambia la lista de nodos secundarios, y los cambios en el contenido de los nodos secundarios no afectarán a pZxid.
cversion = 2 // número de versión del nodo secundario
dataVersion = 0 // número de versión del nodo de datos
aclVersion = 0 //Número de versión de ACL
ephemeralOwner = 0x0 //seddionID de la sesión que creó este nodo. Si el nodo es un nodo persistente, el valor de este atributo es 0.
dataLength = 3 // Longitud del contenido de datos
numChildren = 2 //Número de nodos secundarios
(4) Eliminar nodo
delete /test/local0000000001
deleteall /test
ls
(5) Salir del cliente
quit
Los comandos de uso común se enumeran a continuación
Clasificación | Pedido | describir |
ayudar | ayudar | Ver ayuda |
crear nodo | crear | crear [-s] [-e] datos de ruta acl Entre ellos, -s o -e especifican las características del nodo, la secuencia o el nodo temporal respectivamente, si no se especifica, significa nodo persistente; acl se usa para el control de permisos |
nodo de lectura | ls | ls camino [reloj] |
conseguir | obtener ruta [ver] | |
ls2 | ruta ls2 [reloj] | |
estadística | stat path [ver] Obtener la información de estado del nodo | |
nodo de actualización | colocar | set path data [version] data es el nuevo contenido que se actualizará, version indica la versión de datos |
Eliminar nodo | Eliminar | borrar ruta [versión] |
eliminar todos | es un comando de eliminación recursivo | |
Sincronizar | sincronizar | 使客户端的Znode视图与Zookeeper同步 |
ACL | getACL/setACL | 为Znode获取/设置ACL |
配额 | setquota | 设置子节点个数以及数据长度的配额 setquota –n 4 /zookeeper/node 设置/zookeeper/node 子节点个数最大为4 |
delquota | delquota命令用于删除配额, -n为子节点个数, -b为节点数据长度,如:delquota –n 2 | |
listquota | 命令用于显示配额,如listquota /storm | |
操作历史 | history/redo | history用于列出最近的命令历史,redo命令用于再次执行某个命令,使用方式为redo cmdid 如 redo 20 |
会话 | connect | 连接服务器 |
close | 关闭当前连接,可用connect 再次连接,不会退出客户端 | |
quit | 关闭连接并退出连接客户端 |
2. 集群模式
集群模式这里只做简单介绍,假设有三台服务器node1
、node2
、node3
在单机模式的步骤:2)安装ZooKeeper -> (4)修改配置文件
1)修改zoo.cfg文件时,在后面添加如下集群信息:
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
2)分别在node1
、node2
、node3
三台服务器的/home/xiaobai/opt/zookeeper/tmp
目录中,创建两个文件
touch myid
touch initialize
-
myid: 分别设置
node1
、node2
、node3
三台服务器的文件myid的内容分别为1
、2
、3
,比如对服务器node1
,它对应的集群id号为1
,myid文件的内容即为1
。 -
initialize: 文件initialize留空即可
注意:
- Si se usa el nombre del servidor en lugar de ip entre servidores, preste atención a modificar el archivo de hosts de cada servidor
- Al configurar varios servidores, primero puede configurar un determinado servidor, luego usar el comando de copia remota
scp
para sincronizar y luego ajustar los servidores respectivos, como modificar el archivo myid.
3. Excepciones comunes y soluciones
1. El puerto está ocupado
Mensaje de error: la dirección ya está en uso
Solución:
-
Por un lado, puede optar por detener el proceso que actualmente está ocupando el puerto y usar el comando
netstat -nltp
en combinación con el comandogrep
para consultar -
Por otro lado, puedes modificar zoo.cfg y cambiar el número de puerto
2. No hay suficiente espacio en disco
Mensaje de error: No queda espacio en el dispositivo
Solución: borrar el disco o disco
3. No se puede encontrar el archivo myid
Mensaje de error: falta el archivo myid
Solución: dataDir
Cree un archivo myid en el directorio correspondiente y configure el contenido correcto (la identificación correspondiente al servidor)
4. El puerto de elección líder de otras máquinas en el clúster no está abierto
Mensaje de error: No se puede abrir el canal 2 en la dirección electoral /122.228.242.21:3888
Solución:
-
Verifique si el firewall de cada servidor está cerrado, use el comando
sudo ufw status
-
Verifique si el contenido en cada servidor
/etc/hosts
es consistente y si las IP de todos los nodos están configuradas -
Verifique que la hora de cada servidor sea consistente
-
Modifique el zoo.cfg de cada servidor y modifique el host correspondiente a su propia información de clúster en cada servidor para
0.0.0.0
Por ejemplo, para el servidor node1 en el ejemplo, modifique la información del clúster de su zoo.cfg a
server.1=0.0.0.0:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888